将异常抛出到另一个线程中

iAd*_*nct 6 multithreading posix exception c++11

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

我有生成一个线程的代码,它会关闭并执行自己的操作。

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

一种方法是共享一个变量,并让另一个线程定期检查它是否应该被终止。我的偏好是没有它检查的约束(一些代码将独立于执行线程的库,并且不会被编写来检查)。

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

我有办法做到这一点吗?

Eri*_*sty 7

是的,可以向另一个线程引发异常。

我假设您知道为什么不应在正常程序中完成此操作的所有充分理由。但作为测试套件、调试工具或与 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")
Run Code Online (Sandbox Code Playgroud)

  • C++下是否可以在另一个线程中引发异常?AFAICT 提问者没有提到 python。 (2认同)