سؤال

جئت عبر هذا مثيرة للاهتمام الفقرة في دفعة موضوع الوثائق اليوم:

void wait(boost::unique_lock<boost::mutex>& lock)

...

الآثار:الذرة غلق المكالمة.فتح() وكتل الترابط الحالي.على موضوع تمنع عندما تم إبلاغنا من قبل دعوة إلى هذا->notify_one() أو هذا->notify_all () ، أو spuriously.عندما يكون الموضوع هو الافراج (عن مهما كان السبب) ، قفل إعادة توجيهها من خلال التذرع قفل.قفل() قبل الدعوة إلى الانتظار العوائد.على قفل هو أيضا إعادة توجيهها من خلال التذرع قفل.قفل() إذا كانت وظيفة مخارج مع استثناء.

فما أنا مهتم في معنى كلمة "spuriously".لماذا الخيط يكون الافراج عن زائفة الأسباب ؟ ما يمكن القيام به لحل هذا ؟

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

المحلول

هذا المقال من قبل أنتوني وليامز خاصة مفصلة.

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

ويشير أيضا إلى أنه يجب عدم استخدام timed_wait الزائدة التي تأخذ المدة ، و يجب عليك عموما استخدام الإصدارات التي تأخذ المسند

هذا المبتدئين علة واحد هذا التغلب عليها بسهولة مع بسيطة القاعدة:دائما التحقق من أصلية في حلقة عندما الانتظار مع شرط متغير.أكثر غدرا علة يأتي من timed_wait().

هذا المقال من قبل فلاديمير Prus هو أيضا مثيرة للاهتمام.

ولكن لماذا نحن بحاجة إلى حين حلقة ، لا يمكن أن نكتب:

if (!something_happened)
  c.wait(m);

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

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

نصائح أخرى

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

على ويكيبيديا على زائفة wakeups (الذي يبدو posix مفهوم واسع ، راجع للشغل, لا تقتصر على دفعة) قد تهمك أيضا.

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