【发布时间】:2016-07-28 19:19:38
【问题描述】:
这不是任何涉及从另一个线程中捕获一个线程中抛出的异常的问题的重复。
我有生成线程的代码,它会自行关闭并做自己的事情。
在未来的某个时候,我希望能够在另一个线程中抛出两个异常之一(即terminate 和interrupt)。
一种方法是共享一个变量并让另一个线程定期检查它是否应该被杀死。我的偏好是没有它检查的约束(一些代码将独立于执行线程的库,并且不会被编写来检查)。
在我的理想解决方案中,您最终可能会遇到这样的情况:在调试时,您可能会发现 auto i = 1 + 1 抛出异常,因为另一个线程告诉您的线程抛出异常,而这正是您刚刚发生的情况 在那个时候开启。
有什么办法可以做到吗?
【问题讨论】:
-
说实话,这真的没有任何意义。 C++ 的异常机制基本上是围绕展开发生异常的上下文堆栈进行组织的。或许你可以尝试解释你试图用这个机制解决的问题,你会得到关于解决它的明智方法的建议。通常的答案是这样的:“如果你发现你需要从外部进入以使线程做正确的事情,那意味着你为那个线程编写了错误的代码。为什么它没有被编码来做正确的事情? 所有线程必须合作。”
-
在一个理想的世界里,是的,@DavidSchwartz,他们会的。但是,如果一个线程正在等待某个 API(例如 InfiniBand)返回而它永远不会返回,那么所有广告是否应该合作都没关系:它们不合作。假设你将永远处于这样的位置是幼稚的。
-
肯定有工具可以处理这样的情况,但跨线程异常不是。如果 API 支持中断,您只需使用它支持的中断即可。如果它不支持中断,那么中断就不是解决方案。否则,您必须使用其他工具,例如使用包装器将 API 隔离到自己的进程。
标签: multithreading c++11 exception posix