الانضمام إلى std::thread وفصلها
أنشئ خيوطًا باستخدام std::thread، واختر بين الانضمام والفصل.
الانضمام إلى std::thread وفصلها درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
الصنف std::thread
قدّم الترويسة <thread> دعم تعدد الخيوط إلى المكتبة القياسية في C++11. وتمثل كل نسخة من std::thread خيطًا واحدًا من خيوط نظام التشغيل.
إنشاء خيط
مرّر كائنًا قابلًا للاستدعاء (دالة أو lambda أو كائنًا داليًا) إلى الباني. يبدأ الخيط التنفيذ فورًا.
#include <thread>
#include <iostream>
void worker() { std::cout << "running on thread\n"; }
int main() {
std::thread t(worker);
t.join(); // wait for it to finish
}تمرير الوسائط
مرّر الوسائط إلى الكائن القابل للاستدعاء من خلال الباني.
std::thread t([](int n) { std::cout << n; }, 42);
t.join();التمرير بالمرجع
استخدم std::ref لتمرير الوسائط بالمرجع. ومن دونه، يتلقى الخيط نسخًا من الوسائط.
int counter = 0;
std::thread t([](int& c) { ++c; }, std::ref(counter));
t.join();
std::cout << counter; // 1join(): انتظار الاكتمال
استدعِ join() لحظر الخيط المستدعي حتى ينتهي الخيط المستهدف. بعد join، لا يعود الخيط قابلًا للضم.
detach(): التشغيل باستقلالية
استدعِ detach() لتشغيل الخيط باستقلالية. ويستمر في التنفيذ بعد إتلاف std::thread. ويحرر نظام التشغيل الموارد عند خروج الخيط.
std::thread t([]() { /* background work */ });
t.detach(); // we no longer track itjoinable()
تحقق مما إذا كان يمكن ضم الخيط أو فصله. لا يعود الخيط الذي جرى ضمّه أو فصله قابلًا للضم.
نسيان الضم: الإنهاء
إذا أُتلف كائن std::thread وهو لا يزال قابلًا للضم، يستدعي البرنامج std::terminate. احرص دائمًا على ضم الخيط أو فصله قبل إتلافه.
غلاف RAII
اكتب غلاف RAII صغيرًا يضم الخيط في المدمّر. أو استخدم std::jthread (C++20)، إذ ينضم تلقائيًا.
#include <thread>
// C++20
std::jthread t([] { /* work */ });
// t joins automatically when destroyedالتوازي العتادي
استعلم عن عدد خيوط العتاد باستخدام std::thread::hardware_concurrency(). واستخدمه لتحديد حجم تجمعات الخيوط.
معرّفات الخيوط
لكل خيط معرّف فريد. احصل على معرّف الخيط الحالي باستخدام std::this_thread::get_id().
إيقاف خيط مؤقتًا
استخدم std::this_thread::sleep_for(duration) لإيقاف الخيط الحالي مؤقتًا.
#include <chrono>
using namespace std::chrono_literals;
std::this_thread::sleep_for(500ms);اختبار سريع
ماذا يحدث إذا أُتلف std::thread قابل للضم قبل استدعاء join() أو detach()؟
مراجعة
أنشئ الخيوط باستخدام std::thread وكائن قابل للاستدعاء. احرص دائمًا على استدعاء join() أو detach() قبل إتلاف كائن الخيط — أو استخدم std::jthread (C++20)، الذي ينضم تلقائيًا.
الأسئلة الشائعة
هل درس «الانضمام إلى std::thread وفصلها» مجاني؟
نعم — نص درس «الانضمام إلى std::thread وفصلها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «الانضمام إلى std::thread وفصلها»؟
أنشئ خيوطًا باستخدام std::thread، واختر بين الانضمام والفصل. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الانضمام إلى std::thread وفصلها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الانضمام إلى std::thread وفصلها
- std::mutex وlock_guard وunique_lock
- متغيرات الشرط وأنماط العاملين
- أساسيات std::async وstd::future