أساسيات std::async وstd::future
شغّل المهام بشكل غير متزامن واسترجع نتائجها عبر std::future.
أساسيات std::async وstd::future درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
المهام غير المتزامنة
تشغّل std::async دالةً بشكل غير متزامن، وتعيد std::future يوفّر النتيجة. وهي بديل عالي المستوى عن إدارة الخيوط يدويًا.
الاستخدام الأساسي
مرّر دالة قابلة للاستدعاء ومعاملاتها. تعيد std::async كائنًا من النوع std::future<Result>.
#include <future>
int compute() { return 42; }
std::future<int> f = std::async(compute);
int result = f.get(); // blocks until doneسياسات التشغيل
يتحكم المعامل الأول في وقت تشغيل المهمة:
std::launch::async— يبدأ خيطًا جديدًا فورًاstd::launch::deferred— يشغّل المهمة بشكل متزامن عند استدعاء get()- الافتراضي، من دون سياسة — يختار التنفيذ
auto f = std::async(std::launch::async, compute);أساليب std::future
العمليات الشائعة:
get()— يحجب التنفيذ حتى اكتمال المهمة ويعيد النتيجة، ولمرة واحدة فقطwait()— يحجب التنفيذ لكنه لا يعيد النتيجةwait_for(d)/wait_until(t)— انتظار بمهلةvalid()— هل أُعدّ هذا future؟
تمرير الاستثناءات
إذا أطلقت المهمة غير المتزامنة استثناءً، يُخزَّن الاستثناء في future ويُعاد إطلاقه عند استدعاء get().
auto f = std::async([] { throw std::runtime_error("oops"); });
try {
f.get();
} catch (const std::exception& e) {
std::cout << e.what();
}إعادة قيم متعددة
غلّف النتيجة داخل tuple أو struct أو حاوية.
auto f = std::async([] {
return std::make_pair(42, std::string("hello"));
});
auto [n, s] = f.get();مهام متعددة بالتوازي
شغّل عدة مهام غير متزامنة وانتظر اكتمالها جميعًا.
auto a = std::async(work_a);
auto b = std::async(work_b);
auto c = std::async(work_c);
std::cout << a.get() + b.get() + c.get();std::promise: future يدوي
في أنماط المنتج والمستهلك التي يحتاج فيها المستهلك إلى future بينما يوجد المنتج في خيط آخر، استخدم std::promise.
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread t([&p] { p.set_value(42); });
std::cout << f.get();
t.join();std::packaged_task
يجمع دالة قابلة للاستدعاء مع future. ويكون مفيدًا عندما تُستدعى المهمة في مكان آخر، مثل مجمّع خيوط التنفيذ.
shared_future
لا يمكن قراءة std::future إلا مرة واحدة. يتيح std::shared_future لعدة قرّاء قراءة النتيجة، وهو مفيد لبث نتيجة إلى عدة جهات.
سلوك المدمّر
قد يحجب مدمّر future المُعاد من std::async باستخدام السياسة الافتراضية التنفيذ حتى انتهاء المهمة. انتبه إلى ذلك في المهام طويلة التشغيل.
ما بعد std::async
للتنفيذ غير المتزامن الجاهز للاستخدام في الإنتاج، فكّر في مكتبات مثل Boost.Asio وFolly أو المنفّذات والـ coroutines في C++20/23. تُعدّ std::async نقطة بداية.
تحقق سريع
ماذا يفعل استدعاء .get() على كائن std::future؟
مراجعة
تشغّل std::async دالةً بشكل غير متزامن، ويوفّر std::future المُعاد النتيجة ويمرّر الاستثناءات. استخدم سياسات التشغيل للتحكم في التنفيذ. وللأنماط المعقدة، استخدم std::promise وstd::packaged_task.
تعلم C++ مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «أساسيات std::async وstd::future» مجاني؟
نعم — نص درس «أساسيات std::async وstd::future» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «أساسيات std::async وstd::future»؟
شغّل المهام بشكل غير متزامن واسترجع نتائجها عبر std::future. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «أساسيات std::async وstd::future»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الانضمام إلى std::thread وفصلها
- std::mutex وlock_guard وunique_lock
- متغيرات الشرط وأنماط العاملين
- أساسيات std::async وstd::future