【问题标题】:boost::thread join function blocks calling threadboost::thread 连接函数块调用线程
【发布时间】:2025-11-28 20:00:02
【问题描述】:

问题 1: 我读到,当您在创建线程后调用 join 时,它会阻塞调用它的线程,直到线程函数返回。我正在尝试构建一个可以接受客户端并为每个客户端创建线程的多客户端服务器。问题是,在第一个客户端加入并创建它的线程并调用 join 后,监听线程会挂起,直到完成。我该怎么做才能使该线程运行而不阻塞调用线程? (在 C# 中,我只需调用 Start() 并且调用线程照常运行)。

问题 2: 一般来说(我可能遗漏了一些东西),为什么有人想要一个阻塞线程?那有什么意义呢?只调用一个常规函数不是更容易更快捷吗?

如果有人可以向我解释如何实现与 C# 中的线程相同的功能,那就太好了!

提前致谢!对不起我的英语不好。

【问题讨论】:

  • 干脆不在线程上调用join() 怎么样?

标签: c++ multithreading boost


【解决方案1】:

如何使这个线程运行而不阻塞调用线程

您可以创建线程,然后在其上调用detach(),这样thread 对象的析构函数就不会在线程尚未终止的情况下抛出异常。老实说,我建议在采用这种即发即弃的设计之前三思而后行。在 C++11 中,您可能需要调用 std::async(在这种情况下,您可能需要查看 this Q&A,其中针对该函数的当前缺陷提出了解决方法)。

一般来说(我可能遗漏了一些东西),为什么有人想要一个阻塞线程?那有什么意义呢?只调用一个常规函数不是更容易更快捷吗?

好吧,如果您的程序除了等待任务完成之外别无其他可做,那么可以 - 我会说,只需使用同步调用即可。但可能是您的程序想要并行执行某些操作,一旦完成,它可能需要等待异步计算结束才能继续。在这种情况下,它需要加入线程。

【讨论】:

  • 感谢您的回答!我现在明白为什么有人需要调用 join。
  • @UnTraDe:不客气。还要考虑一下,C++11 有一大堆新的多线程原语,例如std::futurestd::packaged_taskstd::async() 等,您可能想看看。
  • @Andy Prowl 感谢您帮助我停止用头撞墙,这已经持续了一天多!
【解决方案2】:
  1. 不要调用 join()。仅当您希望确保线程已完成执行时才加入线程(例如,当您销毁拥有线程的连接管理器类时,您希望确保线程已完成执行)。
  2. 请参阅关于何时调用 join() 的答案之一。

【讨论】:

  • 感谢您的回答!我的问题没有解决,我不知道线程在构造函数之后自动启动。