有什么方法可以让我知道等待特定信号量的进程或线程的数量?就像一个 API 来检查值。Sem_getvalue() 仅返回 0 而不是负数,其绝对值是在一些站点上提到的信号量上阻塞的任务数。
任何帮助都会很棒。
提前致谢!!
我真的不喜欢 POSIX 信号量。它们缺少 SYS V 信号量可用的许多功能。
如果您使用的是 SYS V 信号量,您可以使用 semctl 函数获取各种信息:
int semctl(int semid, int semnum, int cmd, ...);
例如,要使等待定义的信号量变为零的处理数:
int cnt = semtcl(my_semid, 0, GETZCNT);
就这么简单!
SYS V 信号量万岁!
在 POSIX API 中除了 之外没有其他方法可以做到这一点sem_getvalue
,正如您所看到的,它的语义是可选的。
也就是说,Linux将命名POSIX 信号量实现为 下的文件/dev/shm
,因此类似的实用程序fuser(1)
可以显示哪些进程打开了文件。
如果这对您不起作用,您可以自己使用 POSIX 互斥锁、POSIX 条件变量和一些空间来记录信号量值和任何服务员来实现记账信号量。
可能您可能已经获取了一个全局atomic_t变量并在调用sem_wait之前将其递增,并在您获得信号量的情况下递减。