OS X 上的 sem_init

问题描述 投票:0回答:3

我正在编写一些使用 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
调用后不会改变。

c macos pthreads semaphore
3个回答
101
投票

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

要使用命名信号量而不是未命名信号量,请使用

sem_open
代替
sem_init
,并使用
sem_close
sem_unlink
代替
sem_destroy


25
投票

(目前)比 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);

头文件有详细的文档记录,我发现它非常容易使用。


0
投票

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

“已弃用”的 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

© www.soinside.com 2019 - 2024. All rights reserved.