如果我们在没有等待的情况下发出信号量信号会发生什么?

时间:2013-11-22 09:30:24

标签: c++ multithreading

在我实施的项目中,我遇到了这个场景。我有一个二进制信号量,由一个线程。当该线程执行时,信号量被另一个线程多次发出信号。这是一个问题还是会导致任何未定义的行为?

2 个答案:

答案 0 :(得分:2)

在没有相应等待的情况下发出信号量信号是错误的。如果你这样做会发生什么是依赖于实现的。

如果在Windows信号量对象上调用ReleaseSemaphore会导致超出最大计数,ReleaseSemaphore将返回FALSE。它不会抛出异常或导致致命的运行时错误。

在Linux下,对sem_post的超过最大计数的调用返回-1,errno设置为EOVERFLOW。同样,这对您的申请来说不会是致命的。

在.NET下,调用Release会超过信号量的最大值会导致SemaphoreFullException被抛出。

发布信号量比获取信号量更常见,这是一个逻辑错误。如果你的程序这样做,你就有一个潜在的错误。在你的特定情况下它可能没问题,但是如果你用二进制信号量以外的任何东西来尝试它,你可能最终会遇到一些非常难以发现的错误。

我强烈建议您在释放信号量时检查返回值,并将失败视为致命异常。

答案 1 :(得分:1)

二进制信号量称为Mutex。

什么都不会发生,可以采取或不采取互斥锁,这是唯一的两个状态。释放未获取的互斥锁没有负面影响。

但是,考虑到逻辑可能会受到影响。看起来你在控制互斥锁的时间和方式上看起来并不是很好,这可能会导致你释放另一个线程获得的互斥锁。