Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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++ 不应该';t阻塞操作是否总是可中断的?_C++_Ipc_Deadlock_Thread Synchronization_Boost Interprocess - Fatal编程技术网

C++ 不应该';t阻塞操作是否总是可中断的?

C++ 不应该';t阻塞操作是否总是可中断的?,c++,ipc,deadlock,thread-synchronization,boost-interprocess,C++,Ipc,Deadlock,Thread Synchronization,Boost Interprocess,在我看来,所有的块操作都应该提供一些机制来中断等待并让线程干净地返回,就像WindowsAPI中的操作一样。然而,除了windowsapi之外,这种特性几乎不存在。我不知道为什么 想象一下,如果块操作不提供这样的机制,会发生什么。Boost.Interprocess中的类就是这样一个例子。它的send()和receive()方法被阻塞。这意味着带有阻塞线程的进程将无法完全控制自身。除非某些外部因素起作用,否则这样的进程甚至不能选择干净地退出,因为实际上没有办法迫使被阻塞的线程退出等待状态。除此之

在我看来,所有的块操作都应该提供一些机制来中断等待并让线程干净地返回,就像WindowsAPI中的操作一样。然而,除了windowsapi之外,这种特性几乎不存在。我不知道为什么

想象一下,如果块操作不提供这样的机制,会发生什么。Boost.Interprocess中的类就是这样一个例子。它的
send()
receive()
方法被阻塞。这意味着带有阻塞线程的进程将无法完全控制自身。除非某些外部因素起作用,否则这样的进程甚至不能选择干净地退出,因为实际上没有办法迫使被阻塞的线程退出等待状态。除此之外,如果没有这样的特性,就没有干净的方法来解决已经发生并被检测到的死锁。尽管如此,我还是看到了很多没有这种特性的阻塞操作。为什么会这样?我是不是出了什么问题


另一个例子是C++11。但是,由于它是进程范围的,并且外部因素仍在进程的控制范围内,所以问题并不像机器范围的阻塞机制那样严重。但是仅仅提供一个撤销方法不是更好吗?我知道std::condition\u variable。我只是认为每一个阻塞操作都应该是可中断的,即使是以性能下降为代价。

如果您认为需要“强制阻塞线程退出等待状态”,那么使用阻塞等待可能是一个编码错误,那么这个问题可能更合适。另一方面,我已经实现了调试命令,并向阻塞的任务发送了一个no-op命令(作为恢复测试的捷径)。不是正常代码操作的一部分。如果出现死锁,则说明已经存在实现错误/逻辑错误。IMHO-最好花时间找出原因。@NathanOliver在引用其他站点时,指出Python中的阻塞操作是可中断的通常是有帮助的。例如mutex.acquire(),我认为如果您认为需要“强制阻塞线程退出等待状态”,那么使用阻塞等待可能是一个编码错误,那么这个问题可能更合适。另一方面,我已经实现了调试命令,并向阻塞的任务发送了一个no-op命令(作为恢复测试的捷径)。不是正常代码操作的一部分。如果出现死锁,则说明已经存在实现错误/逻辑错误。IMHO-最好花时间找出原因。@NathanOliver在引用其他站点时,指出Python中的阻塞操作是可中断的通常是有帮助的。例如mutex.acquire()