首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >OS X上的sem_init

OS X上的sem_init
EN

Stack Overflow用户
提问于 2009-09-12 07:58:00
回答 3查看 32.2K关注 0票数 63

我正在编写一些使用pthread和信号量库的代码。sem_init函数在我的Ubuntu机器上运行良好,但在OS上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调用之后它们不会改变。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-20 22:26:14

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

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

票数 99
EN

Stack Overflow用户

发布于 2014-07-08 02:27:33

在OS上有一个比命名信号量更好的解决方案,那就是中央调度中心的dispatch_semaphore_t,它的工作原理非常类似于未命名的POSIX信号量。

初始化信号量:

#include <dispatch/dispatch.h>
dispatch_semaphore_t semaphore;
semaphore = dispatch_semaphore_create(1); // init with value of 1

等待发布(信号)(&P):

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

销毁:

dispatch_release(semaphore);

这个头文件有很好的文档记录,我发现它很容易使用。

票数 24
EN

Stack Overflow用户

发布于 2022-02-20 22:56:59

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

使用像semphore_create和semaphore_wait这样的fns从用户空间调用“不推荐使用的”posix fns和libdispatch/GCD。如果您想要一个总是使用内核/OS的老式sema,您可以直接使用它们,但是使用像GCD这样的sema更好,它在内部使用原子计数器,并且只有在必须等待时才调用内核/OS。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1413785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档