我正在研究一些使用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
调用后不会更改。
答案 0 :(得分:83)
不支持未命名的信号量,您需要使用命名的信号量。
要使用命名信号量而不是未命名的信号量,请使用sem_open
代替sem_init
,并使用sem_close
和sem_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);
头文件有详细记录,我发现它很容易使用。