在等待事物、时间、IO、信号量等的 java 调用中,当等待操作完成的线程被“中断”时,将抛出“InterruptedException”。
显然,Linux 中 Pthreads 使用的“SIGNAL”机制,std::thread 等有点搞砸了,难以管理。
我基本上想实现一种方法来中止互斥锁和信号量等待、等待连接等,从“中断”(kill 或其他)调用另一个线程的线程,并通过异常或返回值捕获已完成的事实在线程内部被“中断”,而不影响任何其他正在运行的线程。
最佳答案
简答:你不能;执行此操作的唯一方法是异步执行等待。
更长的答案: 从概念上讲,如果一个线程可以强制将异常作为其他线程的中断抛出,则它们可以随时执行此操作;不只是在等待、加入或 io 期间。
抛出异常并不总是安全的——例如在析构函数中——因为如果堆栈已经因为异常而被展开,试图抛出另一个异常将导致同时尝试处理 2 个异常——这会导致问题。这在 Java 中是正确的,所以不应该是一个陌生的概念。
Java 和 C# 不是 C++;他们的线程对象不按要求表示 native 线程;因此,在允许的线程数小于线程对象数的情况下,它们所做的一切可能已经是异步的,以防止线程饥饿。
这种差异在 thread::abort 风格的方法中非常显着;这在 C# 和 Java 中很好,但在 C++ 中非常危险,因为它会立即终止 C++ 中的线程,无论它在做什么,包括在 new() 的中间,这可能会锁定互斥体——导致对 new() 的所有进一步调用在您的应用程序中陷入僵局。
关于c++ - 我如何在 C++11 中实现类似 "interrupted exception"行为的 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48062842/