boost :: thread join函数块调用线程

时间:2013-05-11 16:29:54

标签: c++ multithreading boost

问题1: 我读到,当你在创建一个线程后调用join时,它会阻塞调用它的线程,直到线程函数返回。我正在尝试构建一个可以接受客户端并为每个客户端创建线程的乘法客户端服务器。问题是,在第一个客户端加入并创建了它的线程并调用了join之后,listen线程会一直挂起,直到完成为止。如何在不阻塞调用线程的情况下运行此线程? (在C#中我只调用Start()并且调用线程保持正常运行。)

问题2: 一般情况下(我可能会遗漏一些东西),为什么有人想要一个阻塞线程?那是什么意思?只是调用常规函数会不会更容易,更快?

如果有人能解释我如何实现像C#中的线程一样的东西,那就太棒了!

提前致谢!抱歉我的英语不好。

2 个答案:

答案 0 :(得分:4)

  

如何在不阻塞调用线程的情况下运行此线程

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

  

一般情况下(我可能会遗漏某些东西),为什么有人想要一个阻塞线程?那是什么意思?只是调用常规函数会不会更容易,更快?

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

答案 1 :(得分:3)

  1. 不要调用join()。只有在确保线程已完成执行时才加入线程(例如,当您销毁拥有线程的连接管理器类时,您希望确保线程已完成执行)。
  2. 请参阅答案一,了解何时调用join()。