سؤال

وأنا أعمل على بعض التعليمات البرمجية التي تستخدم مكتبات 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);

ويتم توثيق ملف الرأس جيدا، وجدت أنه من السهل جدا للاستخدام.

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