multithreading - 将异常抛出到另一个线程

标签 multithreading c++11 exception posix

这不是涉及捕获从另一个线程抛出的异常的任何问题的重复。

我有产生线程的代码,它关闭并完成自己的事情。

在将来的某个时候,我希望能够在另一个线程中抛出两个异常之一(即terminateinterrupt)。

一种实现方法是共享一个变量,并让另一个线程定期检查是否应终止该变量。我的首选是不受检查的约束(某些代码将独立于执行线程的库,并且不会编写检查代码)。

在我理想的解决方案中,您可能会遇到以下情况:调试时,您可能会发现auto i = 1 + 1引发异常,因为另一个线程告诉您的线程抛出该异常,而这恰好是您当时所在的行。

有办法吗?

最佳答案

是的,有可能在另一个线程中引发异常。

我将假设您知道为什么不应该在常规程序中执行此操作的所有充分原因。但是,例如,作为测试套件,调试工具或其他与python内部相关的程序的一部分,这可能会有所帮助。

大致从https://gist.github.com/liuw/2407154解除了

import ctypes

def ctype_async_raise(target_tid, exception):
    ret = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(target_tid), ctypes.py_object(exception))
    # ref: http://docs.python.org/c-api/init.html#PyThreadState_SetAsyncExc
    if ret == 0:
        raise ValueError("Invalid thread ID")
    elif ret > 1:
        # Huh? Why would we notify more than one threads?
        # Because we punch a hole into C level interpreter.
        # So it is better to clean up the mess.
        ctypes.pythonapi.PyThreadState_SetAsyncExc(target_tid, NULL)
        raise SystemError("PyThreadState_SetAsyncExc failed")

关于multithreading - 将异常抛出到另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36484151/

相关文章:

java - 使用 Java 线程为单线程 TCP 套接字服务器的客户端添加并发

multithreading - 我可以混合搭配 InterlockedIncrement 和 CriticalSection 吗?

c++ - 在 C++ 中获取 Windows 文本?

c++ - memmove 和 c++11 std::move 有什么区别?

c++ - 如何捕获此异常 C++

c# - C# GUI 类如何从工作类接收定期更新?

c++ - C++中的多线程分子模拟

c++ - Eclipse c++11//vector

javascript - 我应该如何处理 JavaScript 中对象构造函数的无效输入

java - Elasticsearch 1.2.1 异常 : Root type mapping not empty after parsing