POSIX二进制信号量

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

iCMS 回答:POSIX二进制信号量

如果您实际上想要一个“吸收”多个帖子而不允许多次等待成功的信号量,尤其是如果您想对此严格,则POSIX信号量不是用于实现它的良好基础。在互斥锁,条件变量和受该互斥锁保护的bool的基础上,实现它的正确原语集。将bool从0更改为1时,您会发出条件变量的信号。

话虽这么说,但您要的是闻起来有些香气;它固有地具有模糊的顺序。例如,如果线程A和B都一个接一个地发送信号量,而线程X和Y都刚刚开始等待,则非计数信号量有可能要么都等待成功,要么只有一个等待,这取决于顺序执行方式:ABXY或AXBY(或其他类似的排列)。因此,该模式可能是错误的,除非在任何给定时间只有一个线程可以进行psot(在这种情况下,为什么要多次发布该线程?也许这不是问题),或者通过保持某种锁(再次,在这种情况下,为什么它会发布不止一次?)。因此,如果您这里没有设计缺陷,则很可能仅使用计数信号量而不将其多次发布即可实现您想要的行为。

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

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

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

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

本文链接:https://www.f2er.com/1623169.html

大家都在问