0Pricing
C++ Academy · درس

أنماط المقارنة والتبديل CAS

نفّذ تحديثات خالية من الأقفال باستخدام compare_exchange_weak وcompare_exchange_strong.

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

بدائية CAS

تقرأ المقارنة والاستبدال القيمة وتقارنها وتكتب قيمة جديدة بشكل مشروط، وكل ذلك ذريًا. وهي أساس معظم الخوارزميات الخالية من الأقفال.

المقارنة والاستبدال في C++

يوجد نوعان في std::atomic:

  • compare_exchange_strong(expected, desired) — ينجح عندما تساوي القيمة الحالية القيمة المتوقعة
  • compare_exchange_weak(expected, desired) — قد يفشل فشلًا كاذبًا

بنية حلقة CAS

حلقة CAS التقليدية: اقرأ، ثم احسب، ثم حاول الكتابة. أعد المحاولة إذا سبقك خيط آخر في الوصول.

std::atomic<int> a{0};

int old = a.load();
int next;
do {
    next = compute_new(old);
} while (!a.compare_exchange_weak(old, next));

استخدام CAS للتحديث الذري

استخدم CAS عندما تعتمد القيمة الجديدة على القديمة. فقد تؤدي store العادية إلى فقدان تحديثات الخيوط المتزامنة.

// Atomic max
int current = a.load();
while (newval > current && !a.compare_exchange_weak(current, newval));

مكدس خالٍ من الأقفال: الإضافة

تستخدم عملية الإضافة إلى مكدس بسيط خالٍ من الأقفال CAS لتثبيت عقدة جديدة في الرأس.

struct Node { int value; Node* next; };
std::atomic<Node*> head{nullptr};

void push(int v) {
    Node* n = new Node{v, nullptr};
    n->next = head.load();
    while (!head.compare_exchange_weak(n->next, n));
}

الفشل الكاذب

قد تفشل compare_exchange_weak حتى عندما تتطابق القيم، وذلك على منصات مثل ARM حيث يُسمح للتعليمة الأساسية بالفشل. استخدمها داخل الحلقات، واستخدم strong عندما تكون إعادة المحاولة مكلفة.

نمط التحديث: إعادة الضبط

لإعادة ضبط قيمة إلى حالة معروفة فقط إذا لم تتغير.

int expected = 42;
if (a.compare_exchange_strong(expected, 0)) {
    // a was 42 and is now 0
}

لبنة أساسية: عداد ذري

بالنسبة إلى عداد عادي، تكون fetch_add أبسط وأسرع من حلقة CAS.

لبنة أساسية: إشارة ذرية

بالنسبة إلى إشارة منطقية بسيطة، يكون std::atomic_flag أخف من std::atomic<bool> ويدعم test_and_set.

الاستدلال بشأن التزامن

من المعروف أن الشيفرة الخالية من الأقفال صعبة التحليل. استخدم اختبارات صارمة مثل TSan والاختبار العشوائي، والنماذج الرسمية عند توفرها، وفضّل التطبيقات الموجودة والمختبرة جيدًا.

متى تختار CAS؟

استخدم CAS عندما:

  • تحدّث خيوط متعددة القيمة نفسها باستمرار
  • تظهر كائنات المزامنة اختناقًا بسبب التنافس
  • يكون القسم الحرج قصيرًا وبسيطًا جدًا

متى لا تستخدم CAS؟

تجنب CAS عندما:

  • يتطلب التحديث أكثر من عمليتين تقريبًا
  • تكون الصحة أهم من معدل المعالجة
  • يفتقر الفريق إلى الخبرة في البرمجة الخالية من الأقفال

تحقق سريع

لماذا نستخدم عادةً compare_exchange_weak داخل حلقة؟

مراجعة

تحدّث المقارنة والاستبدال قيمةً ذريًا فقط إذا كانت تساوي قيمة متوقعة. وتتعامل حلقات CAS مع التحديثات المتزامنة دون أقفال. استخدم compare_exchange_weak داخل الحلقات، وstrong للمحاولات التي تُجرى مرة واحدة.

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

هل درس «أنماط المقارنة والتبديل CAS» مجاني؟

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

ماذا ستتعلم في «أنماط المقارنة والتبديل CAS»؟

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

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

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

كم من الوقت يستغرق درس «أنماط المقارنة والتبديل CAS»؟

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

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

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

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

  1. ‏std::atomic وترتيبات الذاكرة
  2. أنماط المقارنة والتبديل CAS
  3. تنفيذ طابور خالٍ من الأقفال
  4. مؤشرات المخاطر ومشكلة ABA
← العودة إلى C++ Academy