64

我正在编写一些使用 pthread 和 semaphore 库的代码。该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这些值似乎是随机数,调用后它们不会改变。

4

3 回答 3

99

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

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

于 2009-09-20T22:26:14.143 回答
24

比 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);

破坏:

dispatch_release(semaphore);

头文件有据可查,我发现它很容易使用。

于 2014-07-07T18:27:32.673 回答
0

如果你在源代码中查看 sem_init 的实现,那么它只会返回一个错误,而其他一些像 sem_open 这样的 bsd fns 仍然有实现。

“已弃用”的 posix fns 和 libdispatch/GCD 调用都使用 fns 从用户空间调用,例如 semphore_create 和 semaphore_wait。如果您想要一个始终使用内核/操作系统的旧式 sema,您可以直接使用它们,但是您最好使用像 GCD 这样的在内部使用原子计数器并且仅在必须等待时才调用内核/操作系统的 sema。

https://github.com/apple/darwin-xnu/blob/a1babec6b135d1f35b2590a1990af3c5c5393479/bsd/kern/posix_sem.c

于 2022-02-20T22:56:59.270 回答