【问题标题】:How do I know if a boost thread is done?我如何知道 boost 线程是否完成?
【发布时间】:2010-05-10 09:00:03
【问题描述】:

我正在使用 boost::thread 处理队列中的消息。 当第一条消息到来时,我启动一个消息处理线程。 当第二条消息到来时,我检查消息处理线程是否完成。

如果完成了,我会开始一个新的 如果没有完成,我什么都不做。

我怎么知道线程是否完成?我尝试使用 joinable() 但它不起作用,因为当线程完成后,它仍然是可连接的。

我也尝试过一次中断进程,在我的线程末尾添加一个中断点,但是没有成功。

谢谢

编辑:

我想让我的线程休眠一段不确定的时间,并在触发信号时唤醒。

这样做的意思是 boost::condition_variable

【问题讨论】:

    标签: c++ multithreading boost


    【解决方案1】:

    据我所知,您应该使用 join() 方法来等待线程执行结束。您可以通过 timed_join() 将其与超时一起使用。

    您可以使用interrupt() 中断线程。在这种情况下,如果执行到达中断点(a boost::this_thread::sleep() 或 boost::this_thread::interruption_point() ),线程内部将发生异常。您在线程内捕获异常,然后可以将其关闭。

    【讨论】:

      【解决方案2】:

      为每条传入消息生成一个新线程非常低效。您应该查看Thread pool pattern

      编辑:

      对不起,朱尔斯,我误读了你的问题。我建议您查看producer-consumer 模式。查看此article,了解如何使用提升条件变量滚动您自己的阻塞队列。 Intel 的Thread Building Blocks 也有阻塞队列的实现。

      查看这个 SO question,了解现有的无锁队列实现。

      希望这会有所帮助。

      【讨论】:

      • 我的想法是只有一个处理线程。当它完成处理后,我希望它进入睡眠状态,并能够在新消息到来时立即唤醒它。你知道如何用 boost 做到这一点吗?
      • 你需要一个生产者-消费者队列。请参阅上面的附录。
      • 我非常了解生产者-消费者模式。我需要的是一种唤醒事件线程的方法(当缓冲区不再为空时)。我不知道有什么方法可以做到这一点。
      • 我在答案中发布的文章的链接显示了如何使用 Boost 条件变量来等待事件(队列不为空)。您可能还想在这里查看 Boost 的文档:boost.org/doc/libs/release/doc/html/thread/…
      【解决方案3】:

      您是否尝试过使用 boost::this_thread::get_id() 检查 get_id()。如果它们匹配,则线程不存在。但这只有在您退出线程时才会发生。

      【讨论】:

      • 即使线程完成,线程 ID 也总是不同的。如何退出线程?
      • 退出线程我的意思是它应该到达线程停止并返回的地步。但我猜 joinable() 做同样的事情。
      猜你喜欢
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 2011-09-12
      相关资源
      最近更新 更多