متعدد العمليات كيف يتم استخدام فئات التزامن

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

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

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

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

تصميم فئة آمنة من جهة مؤشرات الترابط

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

بعد ذلك قم بإضافة الاستدعاءات المزامنة إلى كافة أعضاء الدالة لتعديل البيانات في الفئة أو الوصول إلى موارد متحكم بها. في كل دالة يجب إنشاء إما كائن CSingleLock أو CMultiLock و استدعاء دالة Lock الخاصة بذلك الكائن. عندما ينتقل كائن القفل خارج النطاق و يُدمر, دالة التدمير الخاصة بالكائن تستدعي Unlock لك لتحرير المورد. وبالطبع، يمكنك استدعاء Unlock مباشرة إذا كنت تريد.

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

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

CSingleLock singleLock(&m_CritSection);
singleLock.Lock();
// resource locked
//.usage of shared resource...

singleLock.Unlock();

ملاحظة

CCriticalSection ، بعكس فئات MFC المزامنة الأخرى، ليس لديه خيار طلب القفل المحدد زمنياً. فترة الانتظار لمؤشر الترابط حتى يتحرر لانهائية.

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

للحصول على معلومات حول تحديد أي فئة المزامنة يجب استخدامها في حالات مختلفة, راجع Multithreading: متى يتم استخدام فئات التزامن للحصول على المزيد من المعلومات حول المزامنة، راجع التزامن في Windows SDK. لمزيد من المعلومات حول دعم تعدد العمليات في MFC راجع تعدد العمليات مع C++ و MFC .

راجع أيضًا:

المبادئ

تعدد العمليات بـ ++C و MFC