C++ 如果我们不等待就发信号会发生什么?
在我实施的项目中,我遇到了这个场景。我有一个由一个线程执行的二进制信号量。当该线程执行时,另一个线程会多次向该信号量发送信号。这是一个问题还是会导致任何未定义的行为???二进制信号量称为互斥量 什么也不会发生,互斥可以被使用,也可以不使用,这是仅有的两种状态。释放未获得的互斥锁没有负面影响C++ 如果我们不等待就发信号会发生什么?,c++,multithreading,C++,Multithreading,在我实施的项目中,我遇到了这个场景。我有一个由一个线程执行的二进制信号量。当该线程执行时,另一个线程会多次向该信号量发送信号。这是一个问题还是会导致任何未定义的行为???二进制信号量称为互斥量 什么也不会发生,互斥可以被使用,也可以不使用,这是仅有的两种状态。释放未获得的互斥锁没有负面影响 但是,考虑到逻辑可能会受到影响。您似乎没有很好地控制何时以及如何向互斥体发送信号,这可能会导致您释放另一个线程获取的互斥体。在没有相应等待的情况下向信号量发送信号是错误的。如果这样做,会发生什么取决于实现 如
但是,考虑到逻辑可能会受到影响。您似乎没有很好地控制何时以及如何向互斥体发送信号,这可能会导致您释放另一个线程获取的互斥体。在没有相应等待的情况下向信号量发送信号是错误的。如果这样做,会发生什么取决于实现 如果对Windows信号量对象的调用将导致超过最大计数,
ReleaseSemaphore
返回FALSE
。它不会引发异常或导致致命的运行时错误
在Linux下,对它的调用将超过最大计数返回-1,并且errno
设置为EOVERFLOW
。同样,这对您的应用程序不会是致命的
在.NET下,对该函数的调用将超过信号量的最大值,从而导致抛出semaphorivelexception
释放信号量的频率高于获取信号量的频率是一个逻辑错误。如果你的程序这样做了,你就有一个潜在的bug。在您的特定情况下,这可能没什么问题,但是如果您尝试使用二进制信号量以外的任何东西,您可能会遇到一些很难找到的bug
我强烈建议您在释放信号量时检查返回值,并将故障视为致命异常。二进制信号量和互斥量的语义不同。感谢您的“切中要害”回答。我在互联网上找到的每一个答案都只是说‘你不应该这么做’,但并没有真正回答学习这两种信号灯时出现的问题!