Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我们不等待就发信号会发生什么?_C++_Multithreading - Fatal编程技术网

C++ 如果我们不等待就发信号会发生什么?

C++ 如果我们不等待就发信号会发生什么?,c++,multithreading,C++,Multithreading,在我实施的项目中,我遇到了这个场景。我有一个由一个线程执行的二进制信号量。当该线程执行时,另一个线程会多次向该信号量发送信号。这是一个问题还是会导致任何未定义的行为???二进制信号量称为互斥量 什么也不会发生,互斥可以被使用,也可以不使用,这是仅有的两种状态。释放未获得的互斥锁没有负面影响 但是,考虑到逻辑可能会受到影响。您似乎没有很好地控制何时以及如何向互斥体发送信号,这可能会导致您释放另一个线程获取的互斥体。在没有相应等待的情况下向信号量发送信号是错误的。如果这样做,会发生什么取决于实现 如

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

二进制信号量称为互斥量

什么也不会发生,互斥可以被使用,也可以不使用,这是仅有的两种状态。释放未获得的互斥锁没有负面影响


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

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

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

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

在.NET下,对该函数的调用将超过信号量的最大值,从而导致抛出
semaphorivelexception

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


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

二进制信号量和互斥量的语义不同。感谢您的“切中要害”回答。我在互联网上找到的每一个答案都只是说‘你不应该这么做’,但并没有真正回答学习这两种信号灯时出现的问题!