pet*_*erk 0 c++ linux multithreading c++11
在等待事物、时间、IO、信号量等的 java 调用中,当等待操作完成的线程被“中断”时,将抛出“InterruptedException”。
显然,Linux、std::thread 等中 Pthreads 使用的“SIGNAL”机制有点混乱且难以管理。
我基本上想实现一种方法来中止互斥锁和信号量等待,等待连接等从另一个线程对线程的“中断”(杀死或其他)调用,并通过异常或返回值捕获这一事实,这是在线程内完成的被“中断”,而不影响任何其他正在运行的线程。
简短的回答:你不能;执行此操作的唯一方法是异步执行等待。
更长的答案: 从概念上讲,如果一个线程可以强制抛出异常作为其他线程的中断,那么它们可以随时执行此操作;不仅仅是在您等待、加入或 io 期间。
抛出异常并不总是安全的 - 例如在析构函数中 - 因为如果堆栈已经因为异常而被展开,尝试抛出另一个异常将导致尝试同时处理 2 个异常 - 这会导致问题。这在 Java 中也是如此,所以不应该是一个陌生的概念。
Java 和 C# 不是 C++;根据要求,它们的线程对象并不代表本机线程;因此,他们所做的一切可能已经是异步的,以防止在允许的线程数量小于线程对象数量的情况下出现线程饥饿。
这种差异在 thread::abort 风格的方法中非常显着;这在 C# 和 Java 中很好,但在 C++ 中非常危险,因为它会立即终止 C++ 中的线程,无论它在做什么,包括处于可能锁定互斥锁的 new() 中间 - 导致对 new() 的所有进一步调用在你的应用程序中陷入僵局。
| 归档时间: |
|
| 查看次数: |
893 次 |
| 最近记录: |