如果我们不等待就发出信号量会发生什么



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

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

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

在Linux下,对sem_post的调用如果超过最大计数,则返回-1,并且errno设置为EOVERFLOW。同样,这对您的应用程序来说并不是致命的。

在.NET下,如果对Release的调用超过信号量的最大值,则会引发SemaphoreFullException

释放信号量的频率高于获取信号量的次数,这是一个逻辑错误。如果你的程序这样做,你就有一个潜在的bug。在您的特定情况下,这可能是可以的,但如果您尝试使用二进制信号量以外的任何东西,您可能会遇到一些很难找到的错误。

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

二进制信号量称为Mutex。

什么都不会发生,互斥可以被接受也可以不被接受,这是仅有的两种状态。释放未获取的互斥体不会产生负面影响。

但是,请考虑逻辑可能会受到影响。您似乎没有很好地控制何时以及如何向互斥体发出信号,这可能会导致您释放另一个线程获取的互斥体。

最新更新