在另一个线程中注入C++异常

Dis*_*ame 5 c++ multithreading signals exception code-injection

使用exception_ptr的C++ 0x特性,可以在一个线程中存储异常,并让另一个线程访问它.但是,另一个线程必须调用rethrow_exception().但是,在某些情况下,我需要实际中断其他线程并立即在那里引发异常; 将exception_ptr轮询为非null不是解决方案.

我找到了一个解决方案,通过挂起线程并修改其指令指针寄存器,然后在恢复之前,在http://www.codeproject.com/KB/exception/ExcInject.aspx中在Windows中注入异常.但是,我还需要我的代码才能在Linux上运行.我如何在那里完成它?

如果我使用像getcontext()这样的东西,它获取当前线程的上下文(而在Windows中,GetContext()接受一个线程参数),所以我必须在信号处理程序中调用它.但是我已经读过不应该在信号处理程序中调用getcontext()/ setcontext()...或者,我可以直接在信号处理程序中调用rethrow_exception(),但我担心这不会产生预期的效果,中断的线程使堆栈以相同的方式展开,并且范围的所有析构函数都被调用等.

Rod*_*ddy 2

我前段时间读过您链接的那篇文章,我有点怀疑。

直接修改另一个线程的指令指针的做法感觉很可怕。您完全不知道您正在中断哪个操作并使其完成一半,并且被中断的操作可能不会期待异常,因此无法自行清理。

在 Windows 上,我已成功使用QueueUserAPC来中止其他线程,一旦它们进入可警报等待状态。我不知道 Linux 中有任何直接等效的东西。