【问题标题】:Restore context of a thread and continue its execution?恢复线程的上下文并继续执行?
【发布时间】:2011-03-20 23:53:37
【问题描述】:

如何让空闲线程再次被激活,以便恢复其上下文并继续执行(例如,如果我希望一个线程在 10 秒后激活,然后每 5 秒激活一次,同时其他线程可以继续运行)?

【问题讨论】:

  • 您需要发布您的线程 API。 Boost、WinAPI、pthreads等
  • 您可能还想说出您想要实现的目标,因为可能有比您概述的更优雅的解决方案。

标签: c++ multithreading activation


【解决方案1】:

你不能让线程休眠所需的时间吗?上下文本质上是线程的一部分,所以会自动恢复。

【讨论】:

  • 就没有其他办法了吗?
  • @interrupted - 有。例如。您可以使用等待计时器并让您的线程等待它。但是,从您的问题来看,完全不清楚为什么简单的 sleep() 是不够的。如果你想得到任何有用的答案,你需要更清楚。
【解决方案2】:

如何让空闲线程再次被激活,以便恢复其上下文并继续执行(例如,如果我希望一个线程在 10 秒后激活,然后每 5 秒激活一次,同时其他线程可以继续运行)?

这取决于您的线程模型:您使用的是 Windows 线程吗?提升线程?线程? XPCOM线程?还有什么?

在 Windows 中,您可以暂停线程并再次激活它们。

在 boost/pthreads 中,您必须:

  • 每五秒启动一个线程,然后让它运行并死掉(五秒后启动另一个)

  • 或者让它已经运行,或者从外部告诉它“你现在处于活动状态”(例如通过调用计时器上的函数)

  • 或者让它休眠五秒钟,然后处理,然后再次休眠

根据我在实践中看到的情况,第二和第三个选项是最常见的选项。第一个有点浪费,因为创建线程可能有点贵(取决于您的平台)。

你想做什么?

【讨论】:

    【解决方案3】:

    根据您使用的线程 API,应该有多种形式的信号可以在线程之间发送以及等待此类信号的方法。

    基于此,当一个线程完成时,你让它等待一个信号(实际上是在休眠并且不使用任何 CPU)。然后,其他一些线程可以将工作项存储在某处,并向睡眠线程发出信号以唤醒。唤醒线程检查是否有可用的工作项,处理该工作项,然后返回等待下一个项目发出信号。

    这是该方法的一个非常简化的版本。 (对于初学者,如果下一个工作项在前一个工作项完成之前存储怎么办?)确切的实现很大程度上取决于您使用的 API。尝试为该 API 找到一些消费者 - 生产者场景,这应该会给你足够的输入来咀嚼。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 2013-03-05
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      相关资源
      最近更新 更多