سؤال

لقد رأيت مؤخرًا سلوك EventWaitHandle القوي في C# وقررت نقل بعض الوظائف في تطبيق شقيق لفعل الشيء نفسه.المشكلة الوحيدة هي أن التطبيق الشقيق مكتوب بلغة C.

ليس هناك مشكلة كبيرة، فأنا أستخدم pthreads، التي تحتوي على نوع بيانات pthread_cond_t الذي يسمح بالإشارة.سؤالي الوحيد هو، هل من الممكن أن يتم "الإشارة" إلى الشرط قبل أن ينتظره شيء ما؟

الآن اختباري يقول لا.أي أنه إذا أطلق ThreadA إشارة قبل انتظار ThreadB، فسوف ينتظر ThreadB إلى أجل غير مسمى.هل هناك نوع آخر من pthread يمكنني استخدامه ويكون أقرب إلى وظيفة EventWaitHandle في C#؟يتم الإشارة إلى الكائن، مما يعني أن الخيط الأول الذي سينتظر عليه، سوف يمر على الفور، ويتم ضبطه على غير مُشار إليه.

لن يكون التفاف pthread_cond في بنية بيانات أخرى أمرًا صعبًا للغاية لتحقيق ذلك.ولكن مرة أخرى، هل هذه الوظيفة متاحة بالفعل في مكتبة pthread؟

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

المحلول

إذا كنت تستخدم متغيرات الحالة بشكل صحيح، فلن يكون هذا مهمًا.

يجب أن يكون التدفق الأساسي للتعليمات البرمجية الخاصة بك (بالكود الكاذب):

lock(lockobj);
while (!signalled) {
    wait(condvar);
}
signalled = false;
unlock(lockobj);

على جانب الانتظار، و:

lock(lockobj);
signalled = true;
notify(condvar);
unlock(lockobj);

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

نصائح أخرى

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

جانب الإنتظار :

lock(lockobj);
while (signalled != 0) {
    wait(condvar);
}
--signalled;
unlock(lockobj);

جانب الإشارة:

lock(lockobj);
++signalled;
notify(condvar);
unlock(lockobj);

انتهى بي الأمر بتغليف نوع الشرط في بنية جديدة وإنشاء بعض الوظائف البسيطة لتتصرف بشكل يشبه إلى حد كبير EventWaitHandle من C#.كنت بحاجة إلى اثنين من كائنات المزامنة لتحقيق الوصول المتسلسل المناسب.

يتم استخدام cond_mutex للانتظار على المتغير الشرطي، بينما يتم استخدام data_mutex عند ضبط الحالة من مُشار إليها إلى غير مُشار إليها.

وضع إعادة الضبط هو نفسه من C#.تلقائي أو يدوي.يسمح هذا لـevent_wait_t بإعادة ضبط نفسه تلقائيًا بعد الانتظار.أو السماح للمبرمج بالقيام بذلك يدويًا من خلال استدعاء events_wait_reset(event_wait_t *ewh);

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