我正在编写一些使用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
调用之后它们不会改变。
发布于 2009-09-20 22:26:14
不支持未命名信号量,您需要使用命名信号量。
要使用命名信号量而不是未命名信号量,请使用sem_open
而不是sem_init
,使用sem_close
和sem_unlink
而不是sem_destroy
。
发布于 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);
这个头文件有很好的文档记录,我发现它很容易使用。
发布于 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://stackoverflow.com/questions/1413785
复制相似问题