sem_init на OS X - PullRequest
       34

sem_init на OS X

52 голосов
/ 12 сентября 2009

Я работаю над кодом, который использует библиотеки pthread и семафор. Функция sem_init отлично работает на моем компьютере с Ubuntu, но в 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.

Ответы [ 2 ]

84 голосов
/ 21 сентября 2009

Безымянные семафоры не поддерживаются, вам нужно использовать именованные семафоры.

Чтобы использовать именованные семафоры вместо неназванных семафоров, используйте sem_open вместо sem_init и используйте sem_close и sem_unlink вместо sem_destroy.

17 голосов
/ 07 июля 2014

Лучшим решением (в наши дни), чем именованные семафоры в OS X, является dispatch_semaphore_t Grand Central Dispatch. Он работает очень похоже на безымянные семафоры 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);

Файл заголовка хорошо документирован, и я нашел его довольно простым в использовании.

...