0Pricing
C++ Academy · درس

‏std::mutex وlock_guard وunique_lock

احمِ الحالة المشتركة باستخدام كائنات mutex ومساعدات القفل المعتمدة على RAII.

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

لماذا نحتاج إلى Mutex؟

تتنافس الخيوط المتعددة على البيانات نفسها عند الوصول إليها. ويضمن mutex الاستبعاد المتبادل، بحيث لا يحتفظ بالقفل في الوقت نفسه إلا خيط واحد.

أساسيات std::mutex

أنشئ القفل ثم اقفله وافتحه. القفل اليدوي عرضة للأخطاء — استخدم دائمًا مساعدات RAII.

#include <mutex>
std::mutex mtx;

mtx.lock();
// critical section
mtx.unlock();

std::lock_guard: قفل RAII

أبسط أقفال RAII. يقفل في الباني ويفتح في المدمّر. ويعمل بصورة مثالية مع المقاطع الحرجة التي لا ترمي استثناءات.

std::mutex mtx;
int counter = 0;

void increment() {
    std::lock_guard<std::mutex> lock(mtx);
    ++counter;
}

std::scoped_lock (C++17)

يشبه lock_guard، لكنه يستطيع قفل عدة كائنات mutex في آن واحد من دون حدوث deadlock. فضّله في الشيفرة الحديثة.

#include <mutex>
std::scoped_lock lock(mtx1, mtx2, mtx3);  // locks all atomically

std::unique_lock: قفل مرن

يوفّر ميزات أكثر من lock_guard:

  • يمكن فتحه وإعادة قفله أثناء النطاق
  • يمكن نقله (ملكية قابلة للنقل)
  • يُستخدم مع متغيرات الشرط
std::unique_lock<std::mutex> lock(mtx);
lock.unlock();        // release temporarily
// ... do something without the lock ...
lock.lock();           // reacquire

تجنب deadlock

يمكن أن تدخل خيطان في deadlock إذا حصلا على الأقفال بترتيب مختلف. احصل على الأقفال بترتيب عام ثابت، أو استخدم std::scoped_lock مع عدة كائنات mutex.

std::lock لعدة كائنات Mutex

قبل C++17، استخدم std::lock للحصول على عدة كائنات mutex ذريًا. أما std::scoped_lock في C++17 فهو أوضح.

Mutex عودي

يتيح std::recursive_mutex للخيط قفله عدة مرات. ويكون ذلك عادةً علامة على وجود مشكلات في التصميم — أعد هيكلة الشيفرة بدلًا من ذلك.

try_lock وtimed_mutex

يعيد try_lock النتيجة فورًا إذا كان القفل مشغولًا. ويدعم std::timed_mutex محاولات القفل المحددة زمنيًا.

قفل القارئ والكاتب

يتيح std::shared_mutex (C++17) لعدة قرّاء العمل بالتزامن أو لكاتب واحد العمل بشكل حصري. استخدمه لأحمال العمل التي يغلب عليها القراءة.

std::shared_mutex sm;
void read()  { std::shared_lock lk(sm);   /* read */ }
void write() { std::unique_lock lk(sm);   /* write */ }

الموازنة في دقة القفل

يؤثر القفل واسع النطاق سلبًا في التزامن. أما القفل الدقيق جدًا فيضيف تكلفة إضافية. قِس الأداء واضبطه.

بدائل خالية من الأقفال

في السيناريوهات التي يكثر فيها التزاحم، فكّر في هياكل بيانات خالية من الأقفال (العمليات الذرية والطوابير الخالية من الأقفال). يصعب بكثير كتابتها بصورة صحيحة — لذا استخدمها عند الحاجة وبعد التحقق منها فقط.

اختبار سريع

أي قفل من أقفال RAII ينبغي تفضيله عند قفل عدة كائنات mutex في آن واحد؟

مراجعة

استخدم std::lock_guard للمقاطع الحرجة البسيطة، وstd::scoped_lock لعدة كائنات mutex، وstd::unique_lock عندما تحتاج إلى المرونة (متغيرات الشرط أو فتح القفل يدويًا). استخدم RAII دائمًا — ولا تستدعِ lock أو unlock يدويًا أبدًا.

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

هل درس «‏std::mutex وlock_guard وunique_lock» مجاني؟

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

ماذا ستتعلم في «‏std::mutex وlock_guard وunique_lock»؟

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

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

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

كم من الوقت يستغرق درس «‏std::mutex وlock_guard وunique_lock»؟

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

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

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

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

  1. الانضمام إلى std::thread وفصلها
  2. ‏std::mutex وlock_guard وunique_lock
  3. متغيرات الشرط وأنماط العاملين
  4. أساسيات std::async وstd::future
← العودة إلى C++ Academy