sem_init على OS X
سؤال
وأنا أعمل على بعض التعليمات البرمجية التي تستخدم مكتبات pthread والإشارة. وظيفة sem_init
يعمل بشكل جيد على آلة أوبونتو، ولكن على OS X وظيفة sem_init
ليس لها اي تأثير. هل هناك شيء خاطئ مع مكتبة أم أن هناك طريقة مختلفة للقيام بذلك؟ هذا هو رمز أستخدمه لاختبار.
sem_t sem1;
sem_t sem2;
sem_t sem3;
sem_t sem4;
sem_t sem5;
sem_t sem6;
sem_init(&sem1, 1, 1);
sem_init(&sem2, 1, 2);
sem_init(&sem3, 1, 3);
sem_init(&sem4, 1, 4);
sem_init(&sem5, 1, 5);
sem_init(&sem6, 1, 6);
والقيم يبدو أن أرقام عشوائية، وأنها لا تغير بعد المكالمة sem_init
.
المحلول
لا يتم اعتماد الإشارات غير المسماة، تحتاج إلى استخدام الإشارات اسمه.
لاستخدام الإشارات اسمه بدلا من الإشارات لم يكشف عن اسمه، استخدم sem_open
بدلا من sem_init
، واستخدام sem_close
وsem_unlink
بدلا من sem_destroy
.
نصائح أخرى
وهناك حل أفضل (هذه الأيام) من الإشارات مسمى على OS X هو dispatch_semaphore_t غراند سنترال ديسباتش ل. وهو يعمل الى حد كبير مثل الإشارات POSIX لم يكشف عن اسمه.
وتهيئة الإشارة:
#include <dispatch/dispatch.h>
dispatch_semaphore_t semaphore;
semaphore = dispatch_semaphore_create(1); // init with value of 1
وانتظر وظيفة (إشارة):
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
...
dispatch_semaphore_signal(semaphore);
وتدمير:
dispatch_release(semaphore);
ويتم توثيق ملف الرأس جيدا، وجدت أنه من السهل جدا للاستخدام.