OS X上的sem_init

Nip*_*rus 54 c macos semaphore pthreads

我正在研究一些使用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);
Run Code Online (Sandbox Code Playgroud)

值似乎是随机数,并且在sem_init调用后它们不会更改.

Nip*_*rus 87

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

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

  • 哇.`<semaphore.h>`声明`sem_init`以便它在OS X上正确编译,但它返回-1并且`errno`设置为`ENOSYS`(函数未实现). (39认同)

Jes*_*ers 18

比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
Run Code Online (Sandbox Code Playgroud)

等待和发布(信号):

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
...
dispatch_semaphore_signal(semaphore);
Run Code Online (Sandbox Code Playgroud)

破坏:

dispatch_release(semaphore);
Run Code Online (Sandbox Code Playgroud)

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

  • @MichaelDorst 错误的问题。基本上,您不应该使用在不同抽象上公开的 API 来控制另一个抽象,除非它们被明确设计为可以一起工作。即使您知道所有细节并且它们现在正在工作,因为实施细节稍后可能会发生变化。如果您没有互操作性的证据,则应假定此类使用由于潜在问题而不安全。并且没有证据表明 GCD API 将按 POSIX 线程的预期工作。 (2认同)