【问题标题】:Sleep thread from another one来自另一个的睡眠线程
【发布时间】: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


【解决方案1】:

这取决于系统。 Windows有一个函数SuspendThread,但我承认我对它了解不多。在 Unix 下,您应该能够使用 pthread_kill 向线程发送信号(尽管它的名字,不会杀死线程,而只是发送信号),并在目标线程中捕获它,信号处理程序的位置可以拨打sleep

【讨论】:

  • SuspendThread() 很好,但是稍后必须有人打电话给ResumeThread(),否则线程将永远挂起。
  • @sharptooth 那应该是线程A,因为它暂停了它,不是吗?
  • @VJovic:是的,但它可能会忘记这样做。如果有一个函数可以将另一个线程挂起一段特定的时间以便自动恢复,那就太好了。我不知道。
  • @sharptooth 简历必须来自同一个线程吗?如果没有,您可以在执行挂起时启动第二个线程,该线程会休眠所需的时间间隔,然后执行恢复。
  • 感谢@JamesKanze 的想法!为了让它便携,我现在有kill(B.native_handle(), SIGINT);关于它是否永远有效的想法?事实上,B 可以产生一个计时线程,但由于它主要用于调试,这不是必需的。
猜你喜欢
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2012-08-08
  • 1970-01-01
  • 2019-11-24
相关资源
最近更新 更多