كتابة برنامج Win32 متعدد العمليات‬

عند كتابة برنامج مع مؤشرات الترابط المتعددة, يجب أن تنسق السلوك الخاص بهم و استخدام موارد البرنامج . يجب أيضاً التأكد من أن كل مؤشر ترابط يتلقى المكدس الخاص به .

مشاركة الموارد المشتركة بين مؤشرات الترابط

ملاحظة

(للحصول على مناقشة مشابهة من وجهة نظر MFC ، راجع متعدد العمليات التلميحات البرمجية و متعدد العمليات متى يتم استخدام فئات التزامن.

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

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

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

برنامج Bounce.c الموضح في نموذج برنامج C متعدد العمليات يستخدم كائن مزامنة باسم ScreenMutex للتنسيق بين تحديثات الشاشة. في كل مرة، يكون أحد مؤشرات ترابط العرض جاهزاً للكتابة على الشاشة، يستدعي WaitForSingleObject بمؤشر لـ ScreenMutex و ثابت ‎INFINITE لتوضيح أنه يجب حظر استدعاء WaitForSingleObject بسبب كائن المزامنة (mutex) و ليس انقضاء مهلة. إذا كان ScreenMutex تم مسحه، فإن دالة الانتظار تعين كائن المزامنة (mutex) بحيث لا تتداخل مؤشرات الترابط الأخرى مع العرض و تتابع تنفيذ مؤشر الترابط. وإلا، يحظر مؤشر ترابط حتى مسح كائن المزامنة (mutex). عند اكتمال تحديث مؤشر الترابط للعرض، عليه تحرير كائن المزامنة (mutex) بواسطة استدعاء ReleaseMutex .

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

HANDLE    hIOMutex= CreateMutex (NULL, FALSE, NULL);

WaitForSingleObject( hIOMutex, INFINITE );
fseek( fp, desired_position, 0L );
fwrite( data, sizeof( data ), 1, fp );
ReleaseMutex( hIOMutex);

مكدسات مؤشر الترابط

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

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

مؤشرات الترابط التي تقوم بإستدعاء مكتبة وقت تشغيل C أو Win32 API يجب أن تسمح بمساحة مكدس كافية للمكتبة و وظائف API التى تستدعيها. دالة printf الخاصة بـ C تتطلب وجود أكثر من 500 بايت مساحة مكدس و يجب أن يكون لديك 2 كيلو مساحة مكدس عند استدعاء إجراءات Win32 API.

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

كما يوفر Win32 تخزين محلي لمؤشر الترابط (TLS) لتخزين البيانات لكل مؤشر ترابط. لمزيد من المعلومات، راجع التخزين المحلي لمؤشر الترابط (TLS).

راجع أيضًا:

المبادئ

تعدد العمليات بال C و Win32