C++ Academy · درس

المهام غير المتزامنة وأنواع Awaiter

ركّب مهام غير متزامنة باستخدام أنواع Awaiter وpromise مخصّصة.

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

المهام غير المتزامنة وأنواع Awaiter درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

Coroutines غير متزامنة

تعلّق المهمة غير المتزامنة تنفيذها أثناء عمليات الإدخال والإخراج، ثم تستأنفه عند اكتمال العملية. ادمج co_await مع واجهات برمجة التطبيقات غير المتزامنة لكتابة تعليمات برمجية غير متزامنة من دون callbacks.

مخطط نوع Task

يغلّف Task coroutine غير متزامنة. وهو يدعم co_await لربط المهام.

template <typename T>
struct Task {
    struct promise_type;
    std::coroutine_handle<promise_type> handle;
    // ...
};

آلية co_await

عندما يرى المصرّف co_await expr، يتوقع أن يكون expr من النوع awaitable. ويتضمن awaitable ثلاث دوال:

  • await_ready() — أعد false لتعليق التنفيذ، أو true لتخطي التعليق
  • await_suspend(handle) — ما ينبغي فعله أثناء التعليق
  • await_resume() — القيمة التي تُعاد إلى التعليمات البرمجية المستدعية

مثال على Awaitable: Sleep

نوع awaitable يجدول استئناف التنفيذ بعد تأخير.

struct Sleep {
    std::chrono::milliseconds duration;
    bool await_ready() const { return false; }
    void await_suspend(std::coroutine_handle<> h) {
        std::thread([h, this] {
            std::this_thread::sleep_for(duration);
            h.resume();
        }).detach();
    }
    void await_resume() {}
};

Task<void> example() {
    co_await Sleep{500ms};
    std::cout << "after 500ms";
}

Awaitable لـ HTTP

توفر المكتبات أنواع awaitable لطلبات HTTP والمؤقتات وعمليات إدخال وإخراج الملفات. ويمكن تركيبها كما تُركب الاستدعاءات المتزامنة.

Task<std::string> fetch() {
    auto data = co_await http_get("/api/data");
    co_return data;
}

تركيب المهام

يؤدي انتظار مهمة داخل مهمة أخرى إلى ربطهما. وتعلّق المهمة الخارجية تنفيذها حتى تكتمل المهمة الداخلية.

Task<int> outer() {
    int x = co_await inner_a();
    int y = co_await inner_b();
    co_return x + y;
}

المهام المتوازية

لإنجاز عمل غير متزامن بالتوازي، ابدأ المهام من دون انتظار كل واحدة منها فورًا، ثم انتظر اكتمالها جميعًا.

Task<int> sum_tasks() {
    auto a = inner_a();
    auto b = inner_b();
    int x = co_await a;
    int y = co_await b;
    co_return x + y;
}

انتشار الاستثناءات

يمكن التقاط الاستثناءات التي تُطرح داخل مهمة غير متزامنة في unhandled_exception الخاصة بـ promise، ثم إعادة طرحها في جهة المنتظر.

الإلغاء

لا توفر المكتبة القياسية حتى الآن آلية إلغاء. وتبني المكتبات، مثل cppcoro وboost.cobalt، آلياتها الخاصة، وعادةً باستخدام رموز الإلغاء أو مصادر الإيقاف.

تكامل Boost.Asio

يدعم Asio coroutines دعمًا أصليًا. ويمكن استخدام co_await مع async_read وasync_write والعمليات المشابهة. وهو أنظف أسلوب حاليًا لعمليات الإدخال والإخراج غير المتزامنة في C++.

الأداء

استئناف coroutine أقل كلفة بكثير من تبديل الخيط. وغالبًا ما يُدرج المصرّف أجزاءً من آلة الحالة داخل الدوال. أجرِ تحليلًا للأداء للتحقق من أن سلسلة awaitable الخاصة بك تُصرَّف بكفاءة.

التوجهات المستقبلية

أضاف C++23 النوع std::generator وتحسينات أخرى. وقد يضيف C++26 std::execution، أي إطار sender/receiver، وهو إطار غير متزامن أكثر عمومية يتكامل مع coroutines.

اختبار سريع

ما الدوال الثلاث التي يحتاج إليها نوع awaitable؟

مراجعة

تجمع المهام غير المتزامنة بين co_await وأنواع awaitable لكتابة تعليمات برمجية غير متزامنة من دون callbacks. وتتضمن أنواع awaitable الدوال await_ready وawait_suspend وawait_resume. وتوفر المكتبات، مثل cppcoro وAsio، أنواعًا جاهزة للمهام وawaitable.

البدء مجانًا

تعلم C++ مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

الأسئلة الشائعة

هل درس «المهام غير المتزامنة وأنواع Awaiter» مجاني؟

نعم — نص درس «المهام غير المتزامنة وأنواع Awaiter» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «المهام غير المتزامنة وأنواع Awaiter»؟

ركّب مهام غير متزامنة باستخدام أنواع Awaiter وpromise مخصّصة. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «المهام غير المتزامنة وأنواع Awaiter»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

  1. مفاهيم Coroutines: ‏co_await وco_yield وco_return
  2. تنفيذ مولّد بسيط
  3. المهام غير المتزامنة وأنواع Awaiter
  4. تخصيص إطار Coroutine
← العودة إلى C++ Academy