تخطَّ إلى المحتوى

الخيوط والتزامن

كنوز تدعم البرمجة المتزامنة من خلال الخيوط والقنوات وآليات التزامن المختلفة، بما في ذلك الخيوط الخضراء (مُجدول M:N) للتزامن خفيف الوزن.

دالة عمل_فرعي() {
اطبع("الخيط الفرعي: بدأ التنفيذ")
لكل ي في 1..4 {
اطبع("الخيط الفرعي: العمل رقم ")
اطبع_صحيح(ي)
}
اطبع("الخيط الفرعي: انتهى التنفيذ")
}
دالة رئيسية() {
اطبع("الخيط الرئيسي: إطلاق خيط فرعي...")
دع مقبض = أطلق(عمل_فرعي())
اطبع("الخيط الرئيسي: يتابع عمله...")
// انتظار انتهاء الخيط
انضم(مقبض)
اطبع("الخيط الرئيسي: الخيط الفرعي انتهى!")
}
دع مقبض = أطلق {
اطبع("خيط الكتلة: مرحباً!")
اطبع("خيط الكتلة: أنا خيط منفصل")
}
انضم(مقبض)
دالة حساب_مجموع() {
دع متغير مجموع = 0;
لكل ي في 1..11 {
مجموع = مجموع + ي;
}
اطبع_صحيح(مجموع);
}
دالة طباعة_أرقام() {
لكل ي في 1..6 {
اطبع_صحيح(ي);
}
}
دالة رئيسية() {
دع خيط1 = أطلق(حساب_مجموع());
دع خيط2 = أطلق(طباعة_أرقام());
انضم(خيط1);
انضم(خيط2);
}

الخيوط الخضراء (M:N Scheduler)

Section titled “الخيوط الخضراء (M:N Scheduler)”

الخيوط الخضراء في كنوز تعمل عبر تجميع الخيوط (Thread Pool): يتم إنشاء N من خيوط النظام (عادةً بعدد نوى المعالج)، والمهام تُوزّع عليها تلقائياً.

عند استخدام أطلق، يتم تلقائياً استخدام الخيوط الخضراء:

دالة عمل(رقم: صحيح) -> صحيح {
اطبع("خيط أخضر بدأ:", رقم)
دع نتيجة = رقم * 10;
اطبع("خيط أخضر انتهى:", رقم)
أرجع نتيجة;
}
دالة رئيسية() {
اطبع("إطلاق 5 خيوط خضراء...")
دع م1 = أطلق(عمل(1));
دع م2 = أطلق(عمل(2));
دع م3 = أطلق(عمل(3));
دع م4 = أطلق(عمل(4));
دع م5 = أطلق(عمل(5));
// انتظار النتائج
دع ن1 = انتظر(م1);
دع ن2 = انتظر(م2);
دع ن3 = انتظر(م3);
دع ن4 = انتظر(م4);
دع ن5 = انتظر(م5);
اطبع("جميع الخيوط انتهت!")
}
  • خفيفة الوزن: يمكنك إطلاق آلاف المهام بدون عبء إنشاء خيوط نظام
  • تلقائية: المُجدول يوزّع المهام على خيوط العمل تلقائياً
  • آمنة: التنظيف يتم تلقائياً عند إنهاء البرنامج
  • تنازل اختياري: استخدم تنازل() للسماح لمهام أخرى بالعمل
دالة عمل_طويل() {
لكل ي في 1..1000 {
// عمل مكثف...
إذا ي % 100 == 0 {
تنازل() // السماح لخيوط أخرى بالعمل
}
}
}
// إنشاء قناة خضراء (سعة 10)
دع ق = قناة_خضراء(10)
// إرسال قيم
أطلق {
لكل ي في 1..6 {
إرسال_أخضر(ق, ي * 10)
}
}
// استقبال قيم
لكل _ في 1..6 {
دع قيمة = استقبال_أخضر(ق)
اطبع("استقبلت:", قيمة)
}

لحماية البيانات المشتركة:

دع قفلي = قفل_جديد()
// قفل
قفل_أقفل(قفلي)
اطبع("البيانات محمية")
// فتح
قفل_افتح(قفلي)
// محاولة القفل (غير مُعيق)
دع نجح = قفل_حاول(قفلي)
إذا نجح {
// استخدم البيانات
قفل_افتح(قفلي)
}
// تحرير
قفل_حرر(قفلي)

للانتظار حتى انتهاء عدة عمليات:

دع انتظار = مجموعة_انتظار_جديد()
// إضافة عدد العمليات
مجموعة_انتظار_أضف(انتظار, 2)
// في كل خيط عند الانتهاء
مجموعة_انتظار_تم(انتظار)
// الانتظار حتى انتهاء الكل
مجموعة_انتظار_انتظر(انتظار)
// تحرير
مجموعة_انتظار_حرر(انتظار)

للعمليات الآمنة على المتغيرات المشتركة:

دع متغير عدد = 0
// إضافة ذرية
دع ناتج = ذري_أضف(&عدد, 10)
اطبع_صحيح(ناتج) // 10
دع ناتج2 = ذري_أضف(&عدد, 5)
اطبع_صحيح(ناتج2) // 15

للتواصل بين الخيوط:

// إنشاء قناة
متغير ق = قناة<صحيح>(3)
// إرسال
أرسل(ق, 10)
أرسل(ق, 20)
أرسل(ق, 30)
// استقبال
دع ق1 = استقبل(ق) // 10
دع ق2 = استقبل(ق) // 20
// التحقق من الحالة
إذا قناة_بيانات(ق) {
اطبع("القناة تحتوي على بيانات")
}
إذا قناة_فارغة(ق) {
اطبع("القناة فارغة")
}
// إغلاق القناة
أغلق(ق)
إذا قناة_مغلقة(ق) {
اطبع("القناة مغلقة")
}
// دالة للخيط الفرعي
دالة عمل_خيط() {
اطبع("الخيط الفرعي يعمل...")
لكل ي في 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
}