首页 > 解决方案 > POSIX 二进制信号量

问题描述

如何使用 POSIX 计数信号量 API 实现二进制信号量?我正在使用一个未命名的信号量,需要将其计数限制为 1。我相信我不能使用互斥锁,因为我需要能够从另一个线程解锁。

标签: cposixmutexsemaphore

解决方案


如果您确实想要一个“吸收”多个帖子而不允许多次等待成功的信号量,特别是如果您想对此严格要求,那么 POSIX 信号量不是用于实现它的良好底层促进剂。在其之上实现它的正确原语集是互斥体、条件变量和bool受互斥体保护的。当bool从 0 更改为 1 时,您向条件变量发出信号。

话虽如此,您要的是一种气味。它本质上具有模棱两可的顺序。例如,如果线程 A 和 B 都一个接一个地发布信号量,并且线程 X 和 Y 都刚刚开始等待,那么您的非计数信号量可能都等待成功或只有一个成功,具体取决于顺序执行:ABXY 或 AXBY(或其他类似排列)。因此,该模式可能是错误的,除非在任何给定时间只有一个线程可能会发布(在这种情况下,为什么它会发布多次?也许这不是问题)或者发布的能力是通过持有来控制的某种锁(同样,在这种情况下,它为什么会多次发布?)。所以如果你在这里没有设计缺陷,它'

如果不是这种情况,那么可能还有一些与信号量相关的其他数据未正确同步,并且您正在尝试将信号量用作条件变量。如果是这种情况,只需在其周围放置一个适当的互斥锁和条件变量并使用它们,然后忘记信号量。

针对您的具体情况的一条评论:

我相信我不能使用互斥锁,因为我需要能够从另一个线程解锁。

如果您使用互斥锁和条件变量的组合,这将成为非问题,因为您不会在工作时保持互斥锁锁定。相反,组合系统正在使用的事实是受互斥锁保护的状态的一部分(例如上面提到的bool),并且任何可以获得互斥锁的线程都可以更改它(将其返回到释放状态)。


推荐阅读