Подтвердить что ты не робот

Sem_init для OS X

Я работаю над некоторым кодом, который использует библиотеки 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.

4b9b3361

Ответ 1

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

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

Ответ 2

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

Destroy:

dispatch_release(semaphore);

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