c++ - 我如何在 C++11 中实现类似 "interrupted exception"行为的 Java

标签 c++ linux multithreading c++11

在等待事物、时间、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/

相关文章:

linux - 在 Ubuntu 12.04 上更新 ffmpeg;与标准存储库中的旧版本冲突

linux :counting the occurence of 1's in each column

c# - 如何处理使用(Py.GIL()) block pythonnet中的异常

java - 如何获取同一应用程序中运行时单个线程的堆使用情况?

c++ - 在 C++ 中对在不同文件中声明和定义的两个类使用相同的命名空间

C++ 拆分字符串每 X 个字符

c++ - 如何向 CMake 提供 vcpkg 信息?

linux - 为什么内核使用默认 block 驱动程序而不是我的驱动程序代码?

c# - 在发生异常时将自定义对象传递给 RunWorkerCompleted 事件

c++ - 传递嵌套仿函数 (C++)