C++ Academy · درس

أساسيات std::async وstd::future

شغّل المهام بشكل غير متزامن واسترجع نتائجها عبر std::future.

الدرس 4 من 414 خطوة

أساسيات 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الانضمام إلى std::thread وفصلها
  2. ‏std::mutex وlock_guard وunique_lock
  3. متغيرات الشرط وأنماط العاملين
  4. أساسيات std::async وstd::future
← العودة إلى C++ Academy