【问题标题】:When does a boost::thread terminate ? How to manage boost::threads?boost::thread 什么时候终止?如何管理 boost::threads?
【发布时间】:2017-08-29 18:03:43
【问题描述】:

我有一个处理 zmq 消息的类。如果收到消息,则该类通知其观察者。这个观察者然后创建一个 boost::thread 来解析收到的 zmq 消息。消息被解析后,观察者启动另一个线程,然后执行解析的命令。

所以有一个观察者为每个传入的消息创建一个线程。如何确保创建的线程在解决消息后被安全销毁?还有在解析器线程中启动的线程会发生什么。最后也必须安全地销毁该线程。

我认为有一个简单的解决方案,但我缺乏多线程的经验,也不知道谷歌什么......

编辑: 当线程自己返回值时,我什至需要关心它们吗?

【问题讨论】:

  • 我不知道 boost,但是为每条传入的消息创建一个新线程似乎很浪费。为什么不使用thread pool
  • 从 C++11 开始有一个标准的std::thread。为什么不使用它?它有更好的文档记录,并且可以在任何符合标准的编译器上开箱即用。

标签: c++ multithreading boost


【解决方案1】:

线程可以分离或连接。如果你加入,你的主线程将被阻塞直到它完成。如果您分离,您的线程将一直运行,直到其完成或您的应用程序终止。假设后者不会发生,这很好。

特别是关于 boost::threads(顺便说一句,您是否可以访问 std::thread - 引入了 C++11)..

当表示执行线程的 boost::thread 对象被破坏时,线程将被分离。一旦线程被分离,它将继续执行,直到构造时提供的函数或可调用对象的调用完成,或者程序终止。也可以通过在 boost::thread 对象上显式调用 detach() 成员函数来分离线程。在这种情况下, boost::thread 对象不再代表现在分离的线程,而是代表 Not-a-Thread。

为了等待执行线程完成,必须使用 boost::thread 对象的 join() 或 timed_join() 成员函数。 join() 将阻塞调用线程,直到 boost::thread 对象表示的线程完成。如果 boost::thread 对象表示的执行线程已经完成,或者 boost::thread 对象表示 Not-a-Thread,则 join() 立即返回。 timed_join() 与此类似,只是如果等待的线程在指定时间过去后未完成,对 timed_join() 的调用也会返回。

顺便说一句,除非此应用程序用于少量连接,否则请考虑一下您是否真的需要每个请求一个线程。有一些开销(10 次微发送,默认情况下有时在 1-2MB 内存之间)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2011-12-15
    • 2017-02-20
    • 2018-04-23
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多