std::atomic وترتيبات الذاكرة
استخدم std::atomic مع ترتيب الذاكرة المناسب لتحقيق الصحة والسرعة.
std::atomic وترتيبات الذاكرة درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
ما بعد كائنات المزامنة
تعمل الأقفال على تسلسل الوصول؛ فهي بسيطة وصحيحة، لكنها تحد من معدل المعالجة. توفر std::atomic لبنات أساسية دون أقفال لكتابة شيفرات متزامنة عالية معدل المعالجة.
أساسيات std::atomic
يغلّف std::atomic<T> قيمةً ويدعم عمليات القراءة والتعديل والكتابة الذرية.
#include <atomic>
std::atomic<int> counter{0};
counter.fetch_add(1); // atomic increment
int v = counter.load();
counter.store(0);العوامل المساعدة
تكون العوامل المعتادة ذريةً بالنسبة إلى الأنواع الحسابية.
std::atomic<int> n{0};
++n; // atomic increment
n += 5; // atomic add
int v = n; // atomic loadلماذا يصعب التعامل مع العمليات الذرية؟
قد تعيد وحدة المعالجة المركزية ترتيب عمليات الذاكرة بين الأنوية. ويحدد ترتيب الذاكرة عمليات إعادة الترتيب المسموح بها.
ترتيبات الذاكرة
خمسة ترتيبات شائعة:
memory_order_relaxed— ذري، لكن دون ترتيبmemory_order_acquire— يُقرن مع release؛ ولا يسمح بإعادة الترتيب بعدهmemory_order_release— يُقرن مع acquire؛ ولا يسمح بإعادة الترتيب قبلهmemory_order_acq_rel— كلاهماmemory_order_seq_cst— متسق تسلسليًا، وهو الافتراضي
الاتساق التسلسلي: الإعداد الافتراضي الآمن
يتصرف seq_cst الافتراضي بصورة بديهية؛ إذ تبدو جميع العمليات الذرية وكأنها تُنفَّذ بترتيب عالمي واحد. وهو أبطأ من الترتيبات المتراخية، لكنه أسهل في التحليل.
إقران الاكتساب والتحرير
استخدم release في المنتج وacquire في المستهلك. بعد عملية الاكتساب، تصبح جميع عمليات الكتابة التي حدثت قبل عملية التحرير المطابقة مرئية.
std::atomic<bool> ready{false};
int data = 0;
// producer
data = 42;
ready.store(true, std::memory_order_release);
// consumer
while (!ready.load(std::memory_order_acquire));
std::cout << data; // sees 42الترتيب المتراخي
تضمن العمليات الذرية المتراخية الذرية، أي عدم حدوث قراءات مجزأة، لكنها تسمح بأي إعادة ترتيب. استخدمها للعدادات البسيطة عندما لا يكون الترتيب مهمًا.
المقارنة والاستبدال
وهي أساس معظم الخوارزميات الخالية من الأقفال. تحدّث compare_exchange_strong(expected, desired) القيمة ذريًا فقط إذا كانت القيمة الحالية تساوي expected.
std::atomic<int> a{10};
int expected = 10;
bool ok = a.compare_exchange_strong(expected, 20);
// if true, a is now 20; otherwise expected holds the actual current valueCAS الضعيف مقابل القوي
قد تفشل compare_exchange_weak فشلًا كاذبًا حتى عندما تتطابق القيم. استخدمها داخل الحلقات، إذ تكون أرخص على بعض المنصات، واستخدم strong خارج الحلقات.
الخالي من الأقفال مقابل الخالي من الانتظار
ضمانان للتقدم:
- الخالي من الأقفال — يحرز خيط واحد على الأقل تقدمًا في أي وقت
- الخالي من الانتظار — يحرز كل خيط تقدمًا خلال زمن محدود
متى تستخدم العمليات الذرية؟
لا تكون العمليات الذرية أسرع دائمًا من كائنات المزامنة. استخدمها عندما تتمكن من إبقاء المسار الحرج بسيطًا، مثل العدادات والإشارات والحالات البسيطة. أما بالنسبة إلى الحالة المشتركة المعقدة، فعادةً ما تكون كائنات المزامنة أكثر أمانًا ووضوحًا.
تحقق سريع
أي ترتيب للذاكرة يوفّر أقوى الضمانات، لكنه أيضًا الأبطأ؟
مراجعة
توفر std::atomic بدائيات دون أقفال مع ترتيب صريح للذاكرة. استخدم memory_order_seq_cst افتراضيًا؛ واستخدم أزواج acquire/release في أنماط المنتج والمستهلك؛ ولا تستخدم relaxed إلا للعمليات الذرية غير المرتبة، مثل العدادات.
الأسئلة الشائعة
هل درس «std::atomic وترتيبات الذاكرة» مجاني؟
نعم — نص درس «std::atomic وترتيبات الذاكرة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «std::atomic وترتيبات الذاكرة»؟
استخدم std::atomic مع ترتيب الذاكرة المناسب لتحقيق الصحة والسرعة. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «std::atomic وترتيبات الذاكرة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- std::atomic وترتيبات الذاكرة
- أنماط المقارنة والتبديل CAS
- تنفيذ طابور خالٍ من الأقفال
- مؤشرات المخاطر ومشكلة ABA