在我实施的项目中,我遇到了这个场景。我有一个二进制信号量,由一个线程。当该线程执行时,信号量被另一个线程多次发出信号。这是一个问题还是会导致任何未定义的行为?
答案 0 :(得分:2)
在没有相应等待的情况下发出信号量信号是错误的。如果你这样做会发生什么是依赖于实现的。
如果在Windows信号量对象上调用ReleaseSemaphore会导致超出最大计数,ReleaseSemaphore
将返回FALSE
。它不会抛出异常或导致致命的运行时错误。
在Linux下,对sem_post的超过最大计数的调用返回-1,errno
设置为EOVERFLOW
。同样,这对您的申请来说不会是致命的。
在.NET下,调用Release会超过信号量的最大值会导致SemaphoreFullException
被抛出。
发布信号量比获取信号量更常见,这是一个逻辑错误。如果你的程序这样做,你就有一个潜在的错误。在你的特定情况下它可能没问题,但是如果你用二进制信号量以外的任何东西来尝试它,你可能最终会遇到一些非常难以发现的错误。
我强烈建议您在释放信号量时检查返回值,并将失败视为致命异常。
答案 1 :(得分:1)
二进制信号量称为Mutex。
什么都不会发生,可以采取或不采取互斥锁,这是唯一的两个状态。释放未获取的互斥锁没有负面影响。
但是,考虑到逻辑可能会受到影响。看起来你在控制互斥锁的时间和方式上看起来并不是很好,这可能会导致你释放另一个线程获得的互斥锁。