الخيوط والتزامن
الخيوط والتزامن
Section titled “الخيوط والتزامن”كنوز تدعم البرمجة المتزامنة من خلال الخيوط والقنوات وآليات التزامن المختلفة، بما في ذلك الخيوط الخضراء (مُجدول M:N) للتزامن خفيف الوزن.
إطلاق الخيوط
Section titled “إطلاق الخيوط”إطلاق خيط بدالة
Section titled “إطلاق خيط بدالة”دالة عمل_فرعي() { اطبع("الخيط الفرعي: بدأ التنفيذ") لكل ي في 1..4 { اطبع("الخيط الفرعي: العمل رقم ") اطبع_صحيح(ي) } اطبع("الخيط الفرعي: انتهى التنفيذ")}
دالة رئيسية() { اطبع("الخيط الرئيسي: إطلاق خيط فرعي...") دع مقبض = أطلق(عمل_فرعي())
اطبع("الخيط الرئيسي: يتابع عمله...")
// انتظار انتهاء الخيط انضم(مقبض) اطبع("الخيط الرئيسي: الخيط الفرعي انتهى!")}إطلاق خيط بكتلة مباشرة
Section titled “إطلاق خيط بكتلة مباشرة”دع مقبض = أطلق { اطبع("خيط الكتلة: مرحباً!") اطبع("خيط الكتلة: أنا خيط منفصل")}
انضم(مقبض)إطلاق عدة خيوط
Section titled “إطلاق عدة خيوط”دالة حساب_مجموع() { دع متغير مجموع = 0; لكل ي في 1..11 { مجموع = مجموع + ي; } اطبع_صحيح(مجموع);}
دالة طباعة_أرقام() { لكل ي في 1..6 { اطبع_صحيح(ي); }}
دالة رئيسية() { دع خيط1 = أطلق(حساب_مجموع()); دع خيط2 = أطلق(طباعة_أرقام());
انضم(خيط1); انضم(خيط2);}الخيوط الخضراء (M:N Scheduler)
Section titled “الخيوط الخضراء (M:N Scheduler)”الخيوط الخضراء في كنوز تعمل عبر تجميع الخيوط (Thread Pool): يتم إنشاء N من خيوط النظام (عادةً بعدد نوى المعالج)، والمهام تُوزّع عليها تلقائياً.
إطلاق خيوط خضراء
Section titled “إطلاق خيوط خضراء”عند استخدام أطلق، يتم تلقائياً استخدام الخيوط الخضراء:
دالة عمل(رقم: صحيح) -> صحيح { اطبع("خيط أخضر بدأ:", رقم) دع نتيجة = رقم * 10; اطبع("خيط أخضر انتهى:", رقم) أرجع نتيجة;}
دالة رئيسية() { اطبع("إطلاق 5 خيوط خضراء...")
دع م1 = أطلق(عمل(1)); دع م2 = أطلق(عمل(2)); دع م3 = أطلق(عمل(3)); دع م4 = أطلق(عمل(4)); دع م5 = أطلق(عمل(5));
// انتظار النتائج دع ن1 = انتظر(م1); دع ن2 = انتظر(م2); دع ن3 = انتظر(م3); دع ن4 = انتظر(م4); دع ن5 = انتظر(م5);
اطبع("جميع الخيوط انتهت!")}مميزات الخيوط الخضراء
Section titled “مميزات الخيوط الخضراء”- خفيفة الوزن: يمكنك إطلاق آلاف المهام بدون عبء إنشاء خيوط نظام
- تلقائية: المُجدول يوزّع المهام على خيوط العمل تلقائياً
- آمنة: التنظيف يتم تلقائياً عند إنهاء البرنامج
- تنازل اختياري: استخدم
تنازل()للسماح لمهام أخرى بالعمل
التنازل (Yield)
Section titled “التنازل (Yield)”دالة عمل_طويل() { لكل ي في 1..1000 { // عمل مكثف... إذا ي % 100 == 0 { تنازل() // السماح لخيوط أخرى بالعمل } }}قنوات الخيوط الخضراء
Section titled “قنوات الخيوط الخضراء”// إنشاء قناة خضراء (سعة 10)دع ق = قناة_خضراء(10)
// إرسال قيمأطلق { لكل ي في 1..6 { إرسال_أخضر(ق, ي * 10) }}
// استقبال قيملكل _ في 1..6 { دع قيمة = استقبال_أخضر(ق) اطبع("استقبلت:", قيمة)}القفل (Mutex)
Section titled “القفل (Mutex)”لحماية البيانات المشتركة:
دع قفلي = قفل_جديد()
// قفلقفل_أقفل(قفلي)اطبع("البيانات محمية")
// فتحقفل_افتح(قفلي)
// محاولة القفل (غير مُعيق)دع نجح = قفل_حاول(قفلي)إذا نجح { // استخدم البيانات قفل_افتح(قفلي)}
// تحريرقفل_حرر(قفلي)مجموعة الانتظار (WaitGroup)
Section titled “مجموعة الانتظار (WaitGroup)”للانتظار حتى انتهاء عدة عمليات:
دع انتظار = مجموعة_انتظار_جديد()
// إضافة عدد العملياتمجموعة_انتظار_أضف(انتظار, 2)
// في كل خيط عند الانتهاءمجموعة_انتظار_تم(انتظار)
// الانتظار حتى انتهاء الكلمجموعة_انتظار_انتظر(انتظار)
// تحريرمجموعة_انتظار_حرر(انتظار)العمليات الذرية
Section titled “العمليات الذرية”للعمليات الآمنة على المتغيرات المشتركة:
دع متغير عدد = 0
// إضافة ذريةدع ناتج = ذري_أضف(&عدد, 10)اطبع_صحيح(ناتج) // 10
دع ناتج2 = ذري_أضف(&عدد, 5)اطبع_صحيح(ناتج2) // 15القنوات (Channels)
Section titled “القنوات (Channels)”للتواصل بين الخيوط:
// إنشاء قناةمتغير ق = قناة<صحيح>(3)
// إرسالأرسل(ق, 10)أرسل(ق, 20)أرسل(ق, 30)
// استقبالدع ق1 = استقبل(ق) // 10دع ق2 = استقبل(ق) // 20
// التحقق من الحالةإذا قناة_بيانات(ق) { اطبع("القناة تحتوي على بيانات")}
إذا قناة_فارغة(ق) { اطبع("القناة فارغة")}
// إغلاق القناةأغلق(ق)
إذا قناة_مغلقة(ق) { اطبع("القناة مغلقة")}المثال الكامل
Section titled “المثال الكامل”// دالة للخيط الفرعيدالة عمل_خيط() { اطبع("الخيط الفرعي يعمل...") لكل ي في 1..4 { اطبع_صحيح(ي) }}
// مثال الخيوط الخضراءدالة عمل_أخضر(رقم: صحيح) -> صحيح { اطبع("خيط أخضر:", رقم) أرجع رقم * 10;}
دالة رئيسية() -> صحيح { اطبع("=== التزامن والخيوط ===")
// === القفل === اطبع("=== القفل ===") دع قفلي = قفل_جديد()
قفل_أقفل(قفلي) اطبع("القفل مغلق")
قفل_افتح(قفلي) اطبع("القفل مفتوح")
قفل_حرر(قفلي)
// === مجموعة الانتظار === اطبع("=== مجموعة الانتظار ===") دع انتظار = مجموعة_انتظار_جديد()
مجموعة_انتظار_أضف(انتظار, 2) مجموعة_انتظار_تم(انتظار) مجموعة_انتظار_تم(انتظار) مجموعة_انتظار_انتظر(انتظار)
اطبع("انتهى الانتظار") مجموعة_انتظار_حرر(انتظار)
// === العمليات الذرية === اطبع("=== العمليات الذرية ===") دع متغير عدد = 0
دع ناتج = ذري_أضف(&عدد, 10) اطبع_صحيح(ناتج)
// === القنوات === اطبع("=== القنوات ===") متغير ق = قناة<صحيح>(3)
أرسل(ق, 10) أرسل(ق, 20)
دع ق1 = استقبل(ق) دع ق2 = استقبل(ق)
اطبع_صحيح(ق1) اطبع_صحيح(ق2)
أغلق(ق)
// === الخيوط الخضراء === اطبع("=== الخيوط الخضراء (M:N) ===") دع م1 = أطلق(عمل_أخضر(1)); دع م2 = أطلق(عمل_أخضر(2)); دع م3 = أطلق(عمل_أخضر(3));
دع ن1 = انتظر(م1); دع ن2 = انتظر(م2); دع ن3 = انتظر(م3);
اطبع("النتائج:", ن1, ن2, ن3)
// === إطلاق الخيوط === اطبع("=== إطلاق الخيوط ===") دع مقبض = أطلق(عمل_خيط()) اطبع("الخيط الرئيسي يتابع") انضم(مقبض) اطبع("الخيط الفرعي انتهى")
أرجع 0}