c-POSIX二进制信号量



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

如果你真的想要一个"吸收";多个post而不允许多次等待成功,尤其是如果你想严格要求这一点,POSIX信号量不是一个很好的底层提示来实现它。在其之上实现它的正确基元集是一个互斥、一个条件变量和一个受互斥保护的bool。将bool从0更改为1时,将发出条件变量的信号。

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

如果不是这样的话,那么可能还有一些与信号量相关的其他数据没有正确同步,而你正试图将信号量作为条件变量来使用。如果是这样,只需在它周围放置一个合适的互斥对象和条件变量并使用它们,然后忘记信号量。

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

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

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

最新更新