OS X上的sem_init

时间:2009-09-11 23:58:00

标签: c macos pthreads semaphore

我正在研究一些使用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 个答案:

答案 0 :(得分:83)

不支持未命名的信号量,您需要使用命名的信号量。

要使用命名信号量而不是未命名的信号量,请使用sem_open代替sem_init,并使用sem_closesem_unlink代替sem_destroy

答案 1 :(得分:16)

比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

等待&amp;发布(信号):

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

破坏:

dispatch_release(semaphore);

头文件有详细记录,我发现它很容易使用。