هل من الممكن تجنب سباق انتظار الاستيقاظ باستخدام Semaphores Posix فقط؟ هل هو حميد؟

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

سؤال

أرغب في استخدام Semaphores Posix لإدارة Get Atomic Get ووضعها من ملف يمثل قائمة انتظار. أريد مرونة الحصول على شيء ما في نظام الملفات ، بحيث يمكن للعمليات غير ذات الصلة تمامًا مشاركة قائمة انتظار. أعتقد أن هذه الخطة تستبعد pthreads. تعد Semaphores المسماة Posix رائعة لوضع شيء ما في نظام الملفات الذي يمكن أن تراه أي عملية ، لكن لا يمكنني العثور على النارويت البدائية القياسية:

... decide we have to wait ....
CondWait(sem, cond);

عندما يتم استدعاء النارويت من خلال عملية ، فإنها تنشر من الناحية الذرية إلى SEM وتنتظر على كوند. عندما تنشر بعض العمليات الأخرى إلى Cond ، تستيقظ عملية الانتظار فقط إذا كان بإمكانها تقليل SEM بشكل ذري أيضًا. بديل

... decide we have to wait ....
sem_post(sem);
sem_wait(cond);
sem_wait(sem);

يخضع لشرط السباق الذي تقوم فيه بعض إشارات العملية الأخرى قبل أن تنتظر هذه العملية.

بالكاد أقوم بأي برمجة متزامنة ، لذلك اعتقدت أنني سأسأل ذلك: إذا كنت أستخدم مؤشرًا قياسيًا في مرحلة الإشارة إلى متغير الحالة ، فهل من الممكن أن يكون هذا السباق حميدًا؟

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

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

المحلول

نظرًا لعدم وجود إجابات أخرى ، سأتابع ما تعلمته:

  • لن تعمل Pthreads مع طلبي لأن لدي عمليات بدون سلف مشترك يحتاج إلى مشاركة قائمة انتظار ذرية.
  • Posix Semaphores نكون مع مراعاة سباق Wakeup-Waiting ، ولكن على عكس متغيرات الحالة الكلاسيكية إنهم يحسبون الإشارات, ، السباق حميد. ليس لدي دليل على هذا الادعاء ، لكن كان لدي نظام يعمل لمدة يومين الآن وأعمل بشكل جيد. (لا معنى له تمامًا ، لكن ذلك على الأقل يعني أنني قد أنجزت المهمة.)
  • Semaphores المسماة Posix من الصعب جمع القمامة من نظام الملفات.

لتلخيص ، تبين أن Semaphores المسماة Posix أساس جيد لتنفيذ تجريد قائمة انتظار ذري لمشاركته بين العمليات غير ذات الصلة.

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

نصائح أخرى

بحسب ال Posix القياسية ، مجموعة روتينات الإشارة هي:

  • sem_close ()
  • sem_destroy ()
  • SEM_GETVALUE ()
  • sem_init ()
  • sem_open ()
  • sem_post ()
  • sem_timedwait ()
  • sem_trywait ()
  • sem_unlink ()
  • sem_wait ()

ال sem_trywait() و sem_timedwait() قد تكون الوظائف ما تبحث عنه.

أعلم أن هذا السؤال قديم ، لكن الحل الواضح هو استخدام الطفرات المشتركة ومتغيرات الحالة الموجودة في ملف يمكنك mmap.

أنت تبحث عن: pthread_cond_wait ، pthread_cond_signal ، على ما أعتقد.
هذا إذا كنت تستخدم مؤشرات ترابط POSIX ، فإن طرق PTHREAD ستوفر وظائف النارويت والإشارة.
ابحث هنا عن التعليمات البرمجية المصدر على Pthreads متعددة المعالجة عبر الذاكرة المشتركة.
http://linux.die.net/man/3/pthread_mutexattr_init
هذا للينكس ، لكن المستندات هي posix. إنها تشبه سولاريس ، لكنك تريد الاطلاع على صفحات الرجل على نظام التشغيل الخاص بك.

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