قفل موتكس C ++

Qfl Mwtks C



من المعروف أن C ++ واحدة من أسرع لغات البرمجة مع الأداء الجيد والدقة العالية ونظام إدارة الذاكرة المناسب. تدعم لغة البرمجة هذه أيضًا التنفيذ المتزامن لعدة مؤشرات ترابط مع مشاركة موارد متعددة فيما بينها. في تعدد مؤشرات الترابط ، يكون مؤشر الترابط هو فقط لأداء عملية القراءة التي لا تسبب أي مشاكل لأن مؤشر الترابط لا يتأثر بما تفعله مؤشرات الترابط الأخرى في ذلك الوقت. ولكن إذا كان لا بد من مشاركة هذه الخيوط في الموارد فيما بينها ، فيمكن أن يقوم مؤشر ترابط واحد بتعديل البيانات في ذلك الوقت مما يؤدي إلى حدوث المشكلة. للتعامل مع هذه المشكلة ، لدينا C ++ “Mutex” الذي يمنع الوصول إلى موارد متعددة نحو الكود / الكائن من خلال توفير المزامنة التي تنص على أنه يمكن توفير الوصول إلى الكائن / الرمز إلى مؤشر ترابط واحد فقط في وقت واحد ، بحيث لا تتمكن العديد من سلاسل الرسائل من الوصول إلى هذا الكائن في وقت واحد.

إجراء:

سوف نتعرف على كيفية إيقاف وصول سلاسل رسائل متعددة إلى كائن في وقت واحد باستخدام قفل كائن المزامنة (mutex lock). سنتحدث عن بناء جملة قفل كائن المزامنة (mutex) ، وما هو خيوط المعالجة المتعددة ، وكيف يمكننا التعامل مع المشكلات التي تسببها خيوط المعالجة المتعددة باستخدام قفل كائن المزامنة (mutex lock). بعد ذلك ، سوف نأخذ مثالاً على خيوط المعالجة المتعددة وننفذ قفل كائن المزامنة (mutex lock) عليها.







بناء الجملة:

إذا أردنا معرفة كيف يمكننا تنفيذ قفل كائن المزامنة (mutex lock) حتى نمنع الوصول إلى خيوط متعددة في وقت واحد نحو الكائن أو الكود الخاص بنا ، فقد نستخدم الصيغة التالية:



$ std :: كائن المزامنة mut_x

$ mut_x. قفل ( ) ؛

func_name باطل ( ) {

$ سوف نكتب // الكود الذي نريد إخفائه من المواضيع المتعددة هنا

$ mut_x. يفتح ( ) ؛

}

سنستخدم الآن بناء الجملة هذا في المثال الوهمي وفي الشفرة الزائفة (التي لا يمكننا تشغيلها كما هي في محرر الشفرة) لنعلمك كيف يمكننا استخدام هذه البنية بالضبط كما هو مذكور في ما يلي:



$ std :: كائن المزامنة mut_x

كتلة باطلة ( ) {

$ mut_x. قفل ( ) ؛

$ std :: كوت << 'أهلا' ؛

$ mut_x. يفتح ( ) ؛

}

مثال:

في هذا المثال ، دعنا نحاول إنشاء عملية متعددة الخيوط أولاً ثم نحيط هذه العملية بقفل كائن المزامنة (mutex lock) وإلغاء القفل لتوفير مزامنة العملية للرمز أو الكائن الذي تم إنشاؤه. يتعامل Mutex مع ظروف السباق وهي القيم التي لا يمكن التنبؤ بها تمامًا وتعتمد على تبديل الخيوط الواعية بالوقت. لتنفيذ مثال كائن المزامنة (mutex) ، نحتاج أولاً إلى استيراد المكتبات المهمة والمطلوبة من المستودعات. المكتبات المطلوبة هي:





$ # تشمل

$ # تشمل

$ # تشمل

تزودنا مكتبة 'iostream' بوظيفة لعرض البيانات كـ Cout ، وقراءة البيانات كـ Cin ، وإنهاء العبارة كـ endl. نستخدم مكتبة 'الخيوط' للاستفادة من البرامج أو الوظائف من الخيوط. تتيح لنا مكتبة 'كائن المزامنة' تنفيذ كل من قفل كائن المزامنة (mutex) وإلغاء القفل في الكود. نستخدم '# include' لأن هذا يسمح لجميع البرامج المتعلقة بالمكتبة المضمنة في الكود.

الآن ، بعد الانتهاء من الخطوة السابقة ، نحدد فئة كائن المزامنة (mutex) أو المتغير الشامل لكائن المزامنة (mutex) باستخدام std. بعد ذلك ، نقوم بإنشاء وظيفة لقفل كائن المزامنة (mutex lock) وإلغاء القفل التي يمكننا الاتصال بها بعد ذلك في الكود. في هذا المثال ، نسمي هذه الوظيفة باسم block. في جسم وظيفة الكتلة ، نطلق أولاً على 'mutex.lock ()' ونبدأ في كتابة منطق الكود.



يرفض mutex.lock () الوصول إلى الخيوط الأخرى للوصول إلى الكائن أو الكود الذي أنشأناه بحيث لا يتمكن سوى مؤشر ترابط واحد من قراءة كائننا في وقت واحد. في المنطق ، نقوم بتشغيل حلقة for تعمل على الفهرس من 0 إلى 9. نعرض القيم في الحلقة. بمجرد إنشاء هذا المنطق في قفل كائن المزامنة (mutex lock) بعد انتهاء تشغيله أو بعد الخروج من المنطق ، فإننا نطلق على طريقة 'mutex.unlock ()'. يسمح لنا استدعاء الأسلوب هذا بإلغاء تأمين الكائن الذي تم إنشاؤه من قفل كائن المزامنة (mutex) نظرًا لأن وصول الكائن إلى مؤشر ترابط واحد تم توفيره مسبقًا وبمجرد إجراء العملية على هذا الكائن بواسطة مؤشر ترابط واحد في وقت واحد. نريد الآن أن تصل الخيوط الأخرى إلى هذا الكائن أو الرمز أيضًا. خلاف ذلك ، ينتقل الكود الخاص بنا في حالة 'الجمود' الذي يتسبب في بقاء الكائن الذي تم إنشاؤه باستخدام كائن المزامنة (mutex) في حالة القفل إلى الأبد ولن يتمكن أي مؤشر ترابط آخر من الوصول إلى هذا الكائن. ومن ثم ، تستمر العملية غير المكتملة في التنفيذ. بعد ذلك ، نخرج من وظيفة الكتلة وننتقل إلى الرئيسي.

بشكل رئيسي ، نعرض ببساطة كائن المزامنة الذي أنشأناه عن طريق إنشاء الخيوط الثلاثة باستخدام 'std :: thread thread_name (استدعاء وظيفة الكتلة التي تم إنشاؤها بالفعل هنا حيث أنشأنا كائن المزامنة)' مع الأسماء thread1 و thread2 و thread3 ، إلخ. بهذه الطريقة ، يتم إنشاء الخيوط الثلاثة. ثم نقوم بضم هذه الخيوط الثلاثة ليتم تنفيذها في وقت واحد عن طريق استدعاء “thread_name. طريقة الانضمام () '. ثم نعيد القيمة التي تساوي صفرًا. الشرح المذكور سابقاً للمثال يتم تنفيذه في شكل كود يمكن أن يظهر في الشكل التالي:

في إخراج الكود ، يمكننا أن نرى تنفيذ وعرض جميع الخيوط الثلاثة واحدة تلو الأخرى. يمكننا أن نرى حتى إذا كان تطبيقنا يندرج تحت فئة تعدد مؤشرات الترابط. ومع ذلك ، لم يقم أي من الخيوط بالكتابة فوق البيانات أو تعديلها ومشاركة المورد المعدل بسبب تنفيذ كائن المزامنة (mutex) الخاص بـ 'كتلة الوظيفة'.

استنتاج

يقدم هذا الدليل شرحًا مفصلاً لمفهوم وظيفة كائن المزامنة (mutex) المستخدمة في C ++. ناقشنا ما هي التطبيقات متعددة مؤشرات الترابط ، وما هي المشاكل التي يجب أن نواجهها في تطبيقات تعدد مؤشرات الترابط ، ولماذا نحتاج إلى تنفيذ كائن المزامنة للتطبيقات متعددة مؤشرات الترابط. ثم ناقشنا بناء جملة كائن المزامنة مع المثال الوهمي باستخدام الشفرة الزائفة. بعد ذلك ، قمنا بتنفيذ مثال كامل على تطبيقات تعدد مؤشرات الترابط باستخدام كائن المزامنة (mutex) في الاستوديو المرئي C ++.