【发布时间】:2011-12-09 08:37:26
【问题描述】:
给定两个线程 A 和 B,是否有任何可移植的方式 A 可以挂起 B,而 B 中没有为此目的的任何自定义代码?
理由:目前,B 是一个非常复杂的算法,当 A(一个监控线程)告诉它时,它应该干净地退出,通过不时检查一些共享标志。问题是,出于调试目的,我想确切地知道 A 请求退出的时刻 B 处于哪个状态(例如,查看我们忘记检查共享标志的位置),所以我想暂停 B(用于调试)来自A。也就是说,我不仅需要同步线程,还需要同步调试线程。
【问题讨论】:
-
你可以通过调试器做到这一点。在 Visual Studio 中,只需右键单击一个线程并选择
freeze。我确信 GDB 也有类似的能力 -
虽然技术上不是“暂停”,但请考虑使用 SIGSEGV 从 A 中终止进程并检查核心转储。
-
@jalf:在那种情况下,几乎不可能获得 A 设置标志的状态
-
@BroesDeCat:在 A 的“setflag”操作上设置断点。当到达该断点时,您可以 (a) 查看每个线程在做什么,并 (b) 冻结您喜欢的线程。但老实说,你可以忘记所有关于“此刻”发生的事情。调用类似
SuspendThread的函数需要时间,当它生效时,被挂起的线程已经有足够的时间执行了。 -
@jalf:我同意我不会立即挂起线程,但必须手动挂起线程对开发人员不友好。
标签: c++ multithreading c++11