查找在 POSIX 信号量上阻塞的任务数

Posted

技术标签:

【中文标题】查找在 POSIX 信号量上阻塞的任务数【英文标题】:Find number of tasks blocking on a POSIX semaphore 【发布时间】:2013-07-24 20:37:48 【问题描述】:

有什么方法可以让我知道等待特定信号量的进程或线程的数量? 就像一个 API 来检查值。 Sem_getvalue() 只返回 0 而不是负数,其绝对值是一些网站提到的阻塞信号量的任务数。

任何帮助都会很棒。

提前致谢!!

【问题讨论】:

我读到了,但是有没有其他方法可以找到它,或者 Linux 只是不允许找到计数? 你想要像“number_of_waiters_that_will_probably_be_obsolete_and_wrong_and_irrelevant_before_you_can_use_it = getNumberOfWaiters(semaphore);”这样的东西吗? 【参考方案1】:

我真的不喜欢 POSIX 信号量。它们缺少 SYS V 信号量提供的许多功能。

如果您使用的是 SYS V 信号量,您可以使用 semctl 函数获取各种信息:

int semctl(int semid, int semnum, int cmd, ...);

例如,要使等待定义的信号量变为零的处理数:

int cnt = semtcl(my_semid, 0, GETZCNT);

就这么简单!

SYS V 信号量万岁!

【讨论】:

【参考方案2】:

在 POSIX API 中除了sem_getvalue 之外没有其他方法可以做到这一点,正如您所看到的,它的语义是可选的。

也就是说,Linux 将 命名 POSIX 信号量实现为 /dev/shm 下的文件,因此像 fuser(1) 这样的实用程序可以显示哪些进程打开了文件。

如果这对您不起作用,您可以自己使用 POSIX 互斥锁、POSIX 条件变量和一些空间来记录信号量值和任何服务员来实现记账信号量。

【讨论】:

【参考方案3】:

您可能已经获取了一个全局 atomic_t 变量并在调用 sem_wait 之前将其递增,并在您获得信号量时递减。

【讨论】:

以上是关于查找在 POSIX 信号量上阻塞的任务数的主要内容,如果未能解决你的问题,请参考以下文章

POSIX Semaphore sem_wait() 无限阻塞

Linux信号量

Linux多线程_(Posix信号量实现环形队列生产者消费者模型)

linux进程间通信之Posix 信号量用法详解代码举例

如何在 c 中使用 posix 命名信号量和 Linux 上两个进程之间的共享内存?

奇怪的 POSIX 信号量行为(卡在 Linux 上的 sem_wait 上)