تنفيذ قائمة الانتظار ذات الأولوية مع متغير حالة في ج

StackOverflow https://stackoverflow.com/questions/1694491

سؤال

إن فهمي الحالي لمتغيرات الشرط هو أن جميع مؤشرات الترابطات المحظورة (الانتظار) إدراجها في قائمة انتظار FIFO الأساسية، يتم استيقاظ العنصر الأول الذي يتم استيقاظه عند استدعاء الإشارة ().

هل هناك أي طريقة لتعديل قائمة الانتظار هذه (أو إنشاء بنية جديدة) لأداء كقائمة انتظار أولوية بدلا من ذلك؟ لقد كنت أفكر في الأمر لفترة من الوقت، ولكن معظم الحلول التي انتهيت منها تعوقها هيكل قائمة الانتظار الحالية الكامنة إلى السيرة الذاتية والمواد الكبرى.

شكرا!

هل كانت مفيدة؟

المحلول

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

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

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

أيضا، ما يحدث إذا بدأ مؤشر ترابط أعلى ذو الأولوية في انتظار متغير شرط في نفس اللحظة التي يتم بها الإشارة إلى متغير الحالة؟ الذين يحصلون على إلغاء حظر، وصول مؤشر ترابط أولوية عالية الأولوية أو مؤشر موضوع الأولوية الأولوية السابقة؟

يعتمد الأمر الذي يتم إلغاء تحديده بالكامل في جدولة مؤشر ترابط Kernel، لذلك أنت في رحمة. لن أفترض حتى الطلب FIFO أيضا.

نصائح أخرى

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

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

إنه المجدول الذي يحدد الخيط الذي سيتم تشغيله. يمكنك أن تنظر في pthread_setschedparam و pthread_getschedparam وكمان مع السياسات (SCHED_OTHER, SCHED_FIFO, ، أو SCHED_RR) والأولويات. ولكن ربما لن تحصل على حيث أظن أنك تريد الذهاب.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top