قفل (علوم الحاسوب)

في علم الحاسوب ، يُعد القفل أو التزامن المتبادل ( mutex ) أداةً أساسيةً للتزامن تمنع تعديل حالة النظام أو الوصول إليها من قِبل عدة سلاسل تنفيذ في آنٍ واحد. تُطبّق الأقفال سياسات التحكم في التزامن القائمة على التزامن المتبادل ، ومع وجود طرق متنوعة ممكنة، توجد تطبيقات فريدة متعددة تناسب مختلف التطبيقات.

الأنواع

عموماً، تُعدّ الأقفال أقفالاً استشارية ، حيث يتعاون كل خيط برمجي من خلال الحصول على القفل قبل الوصول إلى البيانات المقابلة. كما تُطبّق بعض الأنظمة أقفالاً إلزامية ، حيث تُجبر محاولة الوصول غير المصرح به إلى مورد مقفل على حدوث استثناء في الكيان الذي يحاول الوصول إليه.

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

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

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

تتيح معمارية المعالج الأحادي خيار استخدام تسلسلات تعليمات غير قابلة للمقاطعة - باستخدام تعليمات خاصة أو بادئات تعليمات لتعطيل المقاطعات مؤقتًا - لكن هذه التقنية لا تُجدي نفعًا مع أجهزة الذاكرة المشتركة متعددة المعالجات . قد يتطلب الدعم المناسب للأقفال في بيئة متعددة المعالجات دعمًا معقدًا للغاية من حيث الأجهزة أو البرامج، مع ما يصاحب ذلك من مشكلات تزامن كبيرة .

يُشترط استخدام عملية ذرية بسبب التزامن، حيث تُنفّذ أكثر من مهمة نفس المنطق. على سبيل المثال، انظر إلى كود C التالي :

إذا كان القفل يساوي صفرًا ، فقم بتعيينه إلى معرف العملية ( pid ) .

لا يضمن المثال السابق أن المهمة تمتلك القفل، إذ يمكن لأكثر من مهمة اختبار القفل في الوقت نفسه. ولأن كلتا المهمتين ستكتشفان أن القفل غير مستخدم، فستحاولان تثبيته، دون أن تعلم إحداهما أن الأخرى تقوم بتثبيته أيضًا. ويمكن استخدام خوارزمية ديكر أو بيترسون كبديلين في حال عدم توفر عمليات القفل الذرية.

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

تدعم بعض لغات البرمجة الأقفال من الناحية التركيبية. فيما يلي مثال بلغة C# :

namespace Wikipedia.Examples ;باستخدام System.Threading ؛public class Account // هذا مراقب لحساب { // استخدم `object` في الإصدارات الأقدم من C# 13 private readonly Lock _balanceLock = new (); private decimal _balance = 0 ;public void Deposit ( decimal amount ) { // لا يمكن تنفيذ هذه العبارة إلا بواسطة مؤشر ترابط واحد في كل مرة. lock ( _balanceLock ) { _balance += amount ; } }public void Withdraw ( decimal amount ) { // لا يمكن تنفيذ هذه العبارة إلا بواسطة مؤشر ترابط واحد في كل مرة. lock ( _balanceLock ) { _balance -= amount ; } } }

تم تقديم ميزة System.Threading.Lock في لغة C# 13 على .NET 9.

قد يؤدي هذا الكود lock(this)إلى مشاكل إذا كان من الممكن الوصول إلى النسخة بشكل عام. [ 1 ]

على غرار لغة جافا ، يمكن للغة سي شارب أيضًا مزامنة الدوال بأكملها، باستخدام السمة MethodImplOptions.Synchronized . [ 2 ] [ 3 ]

[MethodImpl(MethodImplOptions.Synchronized)] public void SomeMethod () { // do stuff }

الحبيبية

قبل الخوض في تفاصيل دقة القفل، يحتاج المرء إلى فهم ثلاثة مفاهيم حول الأقفال:

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

هناك مفاضلة بين تقليل الحمل الزائد للقفل وتقليل التنازع على القفل عند اختيار عدد الأقفال في عملية التزامن.

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

في نظام إدارة قواعد البيانات ، على سبيل المثال، يمكن للقفل حماية جزء من حقل، أو حقل كامل، أو سجل، أو صفحة بيانات، أو جدول بأكمله، وذلك بترتيب تنازلي من حيث الدقة. تميل الدقة المنخفضة، كاستخدام أقفال الجداول، إلى توفير أفضل أداء لمستخدم واحد، بينما تميل الدقة العالية، كأقفال السجلات، إلى توفير أفضل أداء لعدة مستخدمين.

أقفال قاعدة البيانات

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

تُستخدم آليات لإدارة عمليات العديد من المستخدمين المتزامنين على قاعدة البيانات، والهدف من ذلك هو منع فقدان التحديثات وقراءة البيانات غير المكتملة. يوجد نوعان من آليات القفل: القفل التشاؤمي والقفل التفاؤلي .

  • القفل التشاؤمي : يقوم المستخدم الذي يقرأ سجلاً بهدف تحديثه بوضع قفل حصري عليه لمنع المستخدمين الآخرين من التلاعب به. هذا يعني أنه لا يمكن لأي شخص آخر التلاعب بهذا السجل حتى يقوم المستخدم بإلغاء القفل. لكن من سلبيات هذه الطريقة أن المستخدمين قد يُحرمون من الوصول إلى السجل لفترة طويلة، مما يُبطئ استجابة النظام بشكل عام ويُسبب إحباطاً.
أين يُستخدم التأمين التشاؤمي؟ يُستخدم هذا النوع من التأمين بشكل أساسي في البيئات التي تشهد تنافسًا كبيرًا على البيانات (عدد طلبات المستخدمين إلى نظام قاعدة البيانات في أي وقت)؛ حيث تكون تكلفة حماية البيانات من خلال التأمين أقل من تكلفة التراجع عن المعاملات في حال حدوث تعارضات متزامنة. يُفضل تطبيق التأمين التشاؤمي عندما تكون مدة التأمين قصيرة، كما هو الحال في المعالجة البرمجية للسجلات. يتطلب التأمين التشاؤمي اتصالًا دائمًا بقاعدة البيانات، وهو ليس خيارًا قابلًا للتوسع عند تفاعل المستخدمين مع البيانات، لأن السجلات قد تبقى مؤمنة لفترات طويلة نسبيًا. لذا، فهو غير مناسب للاستخدام في تطوير تطبيقات الويب.
  • القفل التفاؤلي : يسمح هذا النظام لعدة مستخدمين بالوصول إلى قاعدة البيانات في وقت واحد، مع احتفاظ النظام بنسخة من القراءة الأولية التي أجراها كل مستخدم. عندما يرغب مستخدم في تحديث سجل، يتحقق التطبيق مما إذا كان مستخدم آخر قد عدّل السجل منذ آخر قراءة له. يقوم التطبيق بذلك عن طريق مقارنة القراءة الأولية المحفوظة في الذاكرة بسجل قاعدة البيانات للتحقق من أي تغييرات أُجريت على السجل. أي اختلاف بين القراءة الأولية وسجل قاعدة البيانات يُعد انتهاكًا لقواعد التزامن، وبالتالي يتسبب في تجاهل النظام لأي طلب تحديث. يتم إنشاء رسالة خطأ، ويُطلب من المستخدم إعادة بدء عملية التحديث. يُحسّن هذا النظام أداء قاعدة البيانات عن طريق تقليل كمية القفل المطلوبة، مما يُخفف الحمل على خادم قاعدة البيانات. يعمل بكفاءة مع الجداول التي تتطلب تحديثات محدودة، حيث لا يتم قفل أي مستخدم. مع ذلك، قد تفشل بعض التحديثات. يتمثل الجانب السلبي في حالات فشل التحديث المتكررة بسبب كثرة طلبات التحديث من عدة مستخدمين متزامنين، مما قد يُسبب إحباطًا للمستخدمين.
متى يُستخدم القفل التفاؤلي؟ يُعدّ هذا الأسلوب مناسبًا في البيئات التي تشهد تنازعًا منخفضًا على البيانات، أو حيث يكون الوصول للقراءة فقط إلى البيانات مطلوبًا. يُستخدم التزامن التفاؤلي على نطاق واسع في بيئة .NET لتلبية احتياجات تطبيقات الأجهزة المحمولة والتطبيقات غير المتصلة بالإنترنت، [ 4 ] حيث يكون قفل صفوف البيانات لفترات طويلة أمرًا غير عملي. كما أن الحفاظ على أقفال السجلات يتطلب اتصالًا دائمًا بخادم قاعدة البيانات، وهو أمر غير ممكن في التطبيقات غير المتصلة بالإنترنت.

جدول توافق الأقفال

توجد عدة اختلافات وتحسينات لأنواع الأقفال الرئيسية هذه، ولكل منها سلوك حجب مختلف. إذا حجب قفلٌ ما قفلًا آخر، يُقال إن القفلين غير متوافقين ؛ وإلا فهما متوافقان . غالبًا ما تُعرض تفاعلات الحجب بين أنواع الأقفال في المراجع التقنية من خلال جدول توافق الأقفال . فيما يلي مثال على أنواع الأقفال الرئيسية الشائعة:

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

ملاحظة: في بعض المنشورات، يتم ببساطة وضع علامة "متوافق" أو "غير متوافق" على مدخلات الجدول، أو "نعم" أو "لا" على التوالي. [ 5 ]

العيوب

تتضمن حماية الموارد القائمة على الأقفال ومزامنة الخيوط/العمليات العديد من العيوب:

  • مشكلة التنازع: بعض العمليات/الخيوط تنتظر حتى يتم تحرير القفل (أو مجموعة كاملة من الأقفال). إذا مات أحد الخيوط التي تحتفظ بالقفل، أو توقف، أو تعطل، أو دخل في حلقة لا نهائية، فقد تنتظر الخيوط الأخرى التي تنتظر القفل إلى أجل غير مسمى حتى يتم إعادة تشغيل الكمبيوتر .
  • التكاليف الإضافية: يُضيف استخدام الأقفال تكاليف إضافية لكل عملية وصول إلى مورد، حتى عندما تكون احتمالات التصادم نادرة للغاية. (مع ذلك، فإن أي احتمال لحدوث مثل هذه التصادمات يُعد حالة تنافس ).
  • تصحيح الأخطاء: الأخطاء المرتبطة بالأقفال تعتمد على الوقت ويمكن أن تكون دقيقة للغاية ويصعب تكرارها للغاية، مثل حالات الجمود .
  • عدم الاستقرار: قد يكون التوازن الأمثل بين تكلفة الأقفال وتنازعها فريدًا لمجال المشكلة (التطبيق) ويتأثر بالتصميم والتنفيذ، وحتى بالتغييرات المعمارية على مستوى النظام. قد تتغير هذه التوازنات خلال دورة حياة التطبيق، وقد تستلزم تغييرات هائلة لتحديثها (إعادة التوازن).
  • قابلية التركيب: لا تكون الأقفال قابلة للتركيب (على سبيل المثال، إدارة أقفال متزامنة متعددة من أجل حذف العنصر X من الجدول A وإدراج X في الجدول B بشكل ذري) إلا من خلال دعم برمجي متطور نسبيًا (تكلفة إضافية) والتزام تام من قبل برمجة التطبيقات بالاتفاقيات الصارمة.
  • انعكاس الأولوية : قد يمنع خيط/عملية ذات أولوية منخفضة، تحتفظ بقفل مشترك، الخيوط/العمليات ذات الأولوية العالية من المتابعة. يمكن استخدام وراثة الأولوية لتقليل مدة انعكاس الأولوية. يمكن استخدام بروتوكول سقف الأولوية على أنظمة المعالجات الأحادية لتقليل أسوأ مدة لانعكاس الأولوية، بالإضافة إلى منع حدوث حالة جمود .
  • التزامن : يجب على جميع الخيوط الأخرى الانتظار إذا تم إلغاء جدولة خيط يحمل قفلًا بسبب مقاطعة شريحة زمنية أو خطأ في الصفحة.

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

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

عدم قابلية التركيب

إحدى أكبر مشاكل البرمجة القائمة على الأقفال هي أن "الأقفال لا تُركّب ": فمن الصعب دمج وحدات صغيرة وصحيحة قائمة على الأقفال في برامج أكبر بنفس القدر من الصحة دون تعديل هذه الوحدات أو على الأقل معرفة تفاصيلها الداخلية. يقدم سيمون بيتون جونز (أحد دعاة ذاكرة المعاملات البرمجية ) المثال التالي لتطبيق مصرفي: [ 6 ] صمم فئة حساب تسمح لعدة عملاء متزامنين بإيداع أو سحب الأموال من حساب واحد، وقدم خوارزمية لتحويل الأموال من حساب إلى آخر.

الحل القائم على القفل للجزء الأول من المشكلة هو:

فئة الحساب: عضو الرصيد: عدد صحيح، عضو mutex: قفل طريقة الإيداع (n: عدد صحيح) mutex.lock() التوازن ← التوازن + ن mutex.unlock() دالة السحب (n: عدد صحيح) إيداع(-ن)

الجزء الثاني من المشكلة أكثر تعقيدًا بكثير. سيكون روتين النقل الصحيح للبرامج التسلسلية كالتالي:

دالة التحويل (من: الحساب، إلى: الحساب، المبلغ: عدد صحيح) from.withdraw(amount) to.deposit(amount)

في البرامج المتزامنة، تكون هذه الخوارزمية غير صحيحة، لأنه عندما يكون أحد الخيوط في منتصف عملية التحويل ، قد يلاحظ خيط آخر حالة تم فيها سحب المبلغ من الحساب الأول، ولكن لم يتم إيداعه بعد في الحساب الآخر: أي أن الأموال قد اختفت من النظام. لا يمكن حل هذه المشكلة تمامًا إلا بوضع أقفال على كلا الحسابين قبل تغيير أي منهما، ولكن يجب حينها وضع الأقفال وفقًا لترتيب عام عشوائي لمنع حدوث حالة تعطل.

دالة التحويل (من: الحساب، إلى: الحساب، المبلغ: عدد صحيح) إذا كان من < إلى // ترتيب عشوائي على الأقفال from.lock() to.lock() آخر to.lock() from.lock() from.withdraw(amount) to.deposit(amount) from.unlock() to.unlock()

يصبح هذا الحل أكثر تعقيدًا عندما يتعلق الأمر بمزيد من الأقفال، وتحتاج دالة النقل إلى معرفة جميع الأقفال، لذلك لا يمكن إخفاؤها .

الدعم اللغوي

تختلف لغات البرمجة في دعمها للتزامن:

الأقفال المتبادلة مقابل الإشارات الثنائية

الميوتكس هو آلية قفل تستخدم أحيانًا نفس التنفيذ الأساسي للسيمفور الثنائي. ومع ذلك، يختلفان في طريقة الاستخدام. فبينما يُشار إلى السيمفور الثنائي أحيانًا باسم ميوتكس، فإن الميوتكس الحقيقي له استخدام وتعريف أكثر تحديدًا، حيث يُفترض أن المهمة التي قامت بقفل الميوتكس فقط هي التي تستطيع فك قفله. ويهدف هذا القيد إلى معالجة بعض المشاكل المحتملة لاستخدام السيمفورات.

  1. انعكاس الأولوية : إذا كان القفل يعرف من قام بقفله ومن المفترض أن يقوم بفك قفله، فمن الممكن ترقية أولوية تلك المهمة كلما بدأت مهمة ذات أولوية أعلى في انتظار القفل.
  2. إنهاء المهمة قبل الأوان: قد توفر الأقفال المتبادلة أيضًا حماية من الحذف، حيث لا يمكن حذف المهمة التي تحتفظ بالقفل المتبادل عن طريق الخطأ. (وهذا له ثمن أيضًا؛ فإذا كان القفل المتبادل يمنع استعادة المهمة، فسيتعين على جامع البيانات المهملة مراقبة القفل المتبادل).
  3. حالة الجمود النهائي: إذا انتهت مهمة تحتفظ بـ mutex لأي سبب من الأسباب، فيمكن لنظام التشغيل تحرير mutex وإرسال إشارة إلى المهام المنتظرة بهذه الحالة.
  4. حالة الجمود التكراري: يُسمح للمهمة بقفل mutex قابل لإعادة الدخول عدة مرات بقدر ما تقوم بفك قفله عددًا متساويًا من المرات.
  5. التحرير العرضي: يتم رفع خطأ عند تحرير mutex إذا لم تكن المهمة التي تقوم بالتحرير هي مالكها.

انظر أيضاً

مراجع

  1. "عبارة القفل (مرجع C#)" . 4 فبراير 2013.
  2. "ThreadPoolPriority, and MethodImplAttribute" . MSDN. ص. ?? . تم الاطلاع عليه بتاريخ 22-11-2011 . 
  3. "لغة سي شارب من منظور مطور جافا" . تم الاطلاع عليه بتاريخ 22-11-2011 .{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  4. "تصميم مكونات طبقة البيانات وتمرير البيانات عبر الطبقات" . مايكروسوفت . أغسطس 2002. مؤرشف من الأصل في 8 مايو 2008. تم الاطلاع عليه في 30 مايو 2008 .
  5. "بروتوكول التحكم بالتزامن القائم على القفل في أنظمة إدارة قواعد البيانات" . GeeksforGeeks . 2018-03-07 . تم الاطلاع عليه بتاريخ 2023-12-28 .
  6. بيتون جونز، سيمون (2007). "التزامن الجميل" (ملف PDF) . في ويلسون، جريج؛ أورام، آندي (محرران). الكود الجميل: مبرمجون رائدون يشرحون طريقة تفكيرهم . أورايلي.
  7. ISO/IEC 8652:2007. "الوحدات المحمية والكائنات المحمية" . دليل مرجعي لـ Ada 2005. تم الاطلاع عليه بتاريخ 27-02-2010 . يوفر الكائن المحمي وصولاً منسقاً إلى البيانات المشتركة، من خلال استدعاءات على عملياته المحمية الظاهرة، والتي يمكن أن تكون برامج فرعية محمية أو مدخلات محمية. {{cite book}}: صيانة CS1: الأسماء الرقمية: قائمة المؤلفين ( رابط )
  8. ISO/IEC 8652:2007. "مثال على تحديد المهام والمزامنة" . دليل مرجعي لبرنامج Ada 2005. تم الاطلاع عليه بتاريخ 27-02-2010 . {{cite book}}: صيانة CS1: الأسماء الرقمية: قائمة المؤلفين ( رابط )
  9. cppreference.com. "ملف رأس المكتبة القياسية <threads.h> (C11)" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 14 أبريل 2026 .
  10. مارشال، ديف (مارس 1999). "أقفال الاستبعاد المتبادل" . تم الاسترجاع في 30 مايو 2008 .
  11. cppreference.com. "رأس المكتبة القياسية <mutex> (C++11)" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 14 أبريل 2026 .
  12. "مزامنة" . msdn.microsoft.com . تم الاطلاع عليه بتاريخ 30-05-2008 .
  13. مايكروسوفت ليرن. "قفل الفصل" . learn.microsoft.com . مايكروسوفت ليرن . تم الاطلاع عليه بتاريخ 14 أبريل 2026 .
  14. "التزامن" . صن مايكروسيستمز . تم الاسترجاع في 30-05-2008 .
  15. شركة أوراكل (17 مارس 2026). "قفل الواجهة" . docs.oracle.com . وثائق Java SE.
  16. "مرجع ترابط الخيوط في أجهزة أبل" . شركة أبل . تم الاطلاع عليه بتاريخ 17-10-2009 .
  17. "مرجع NSLock" . شركة Apple . تم الاطلاع عليه بتاريخ 17-10-2009 .
  18. "مرجع NSRecursiveLock" . شركة Apple . تم الاطلاع عليه بتاريخ 17-10-2009 .
  19. "مرجع NSConditionLock" . شركة Apple . تم الاطلاع عليه بتاريخ 17-10-2009 .
  20. "مرجع بروتوكول NSLocking" . شركة Apple . تم الاطلاع عليه بتاريخ 17-10-2009 .
  21. "قطيع" .
  22. "فئة Mutex" . مؤرشف من الأصل بتاريخ 2017-07-04 . تم الاطلاع عليه بتاريخ 2016-12-29 .
  23. لوند، فريدريك (يوليو 2007). "آليات مزامنة الخيوط في بايثون" . مؤرشف من الأصل في 1 نوفمبر 2020. تم الاطلاع عليه في 30 مايو 2008 .
  24. جون ريد (2010). "المصفوفات المشتركة في معيار فورتران القادم" (ملف PDF) . تم الاطلاع عليه بتاريخ 17 فبراير 2020 .
  25. "class Thread::Mutex" .
  26. "std::sync::Mutex - Rust" . doc.rust-lang.org . تم الاطلاع عليه بتاريخ 3 نوفمبر 2020 .
  27. "التزامن ذو الحالة المشتركة - لغة برمجة Rust" . doc.rust-lang.org . تم الاطلاع عليه في 3 نوفمبر 2020 .
  28. مارلو، سيمون (أغسطس 2013). "التزامن الأساسي: الخيوط والمتغيرات المتعددة". البرمجة المتوازية والمتزامنة في هاسكل . دار نشر أورايلي ميديا . رقم ISBN 9781449335946.
  29. مارلو، سيمون (أغسطس 2013). "ذاكرة المعاملات البرمجية". البرمجة المتوازية والمتزامنة في هاسكل . أورايلي ميديا . ISBN 9781449335946.
  30. "sync package - sync - pkg.go.dev" . pkg.go.dev . تم الاسترجاع بتاريخ 23-11-2021 .
  • شرحٌ مبسطٌ للأقفال والأقسام الحرجة