2009-09-11 4 views
47

Я работаю над некоторым кодом, который использует библиотеки pthread и семафора. Функция sem_init отлично работает на моей машине ubuntu, но в OS X функция sem_init абсолютно не влияет. Что-то не так с библиотекой или есть другой способ сделать это? Это код, который я использую для тестирования.sem_init на OS X

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.

+3

Вы должны проверить возвращаемое значение 'sem_init'. – bfontaine

+0

Обратите внимание, что в Mac OS X Yosemite (10.10), по крайней мере, 'sem_init()', 'sem_destroy()' и 'sem_getvalue()' отмечены «устаревшими» и генерируют предупреждения компилятора. –

+0

@ JonathanLeffler О, нет. Он не может работать в Mac OS X Yosemite (10.10.1). – vipygd

ответ

77

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

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

+32

Ничего себе. '' объявляет 'sem_init', так что он правильно компилируется в OS X, но возвращает -1 с' errno', установленным в 'ENOSYS' (функция не реализована). –

+0

Хорошо, теперь я ищу хороший пример семафоров, использующих библиотеки ускорения C++. Я слышал, что это надежная реализация – jcpennypincher

+0

'sem_getvalue()' тоже не работает ... См. Http://stackoverflow.com/questions/16655153/sem-getvalue-dysfunctionality-in-mac-os -xc/16655541 # 16655541 – user454322

15

Лучшее решение (в наши дни), чем названные семафоры на OS X, - это диспетчер отправки Grand Central Dispatch_semaphore_t. Он очень похож на неназванные семафоры POSIX.

Инициализировать семафор:

#include <dispatch/dispatch.h> 
dispatch_semaphore_t semaphore; 
semaphore = dispatch_semaphore_create(1); // init with value of 1 

Wait & пост (сигнал):

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
... 
dispatch_semaphore_signal(semaphore); 

Destroy:

dispatch_release(semaphore); 

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

+0

Семафор GCD - это функция уровня GCD. Теоретически это может вызвать некоторые проблемы в сочетании с уровнем pthread. – Eonil