2013-05-11 54 views
3

问题1: 我读到,当你调用创建线程阻塞调用它,直到线程函数返回的线程后加入。我正在尝试构建一个可以接受客户端并为每个客户端创建线程的乘法客户端服务器。问题是,在第一个客户端加入并创建它的线程并调用join之后,listen线程挂起,直到完成。我能做些什么来使这个线程运行而不会阻塞调用线程? (在C#中,我只需调用Start(),调用线程照常运行)。的boost ::线程加入的功能块调用线程

问题2: 一般(IM可能缺少的东西),为什么会有人想要一个阻塞线程?那有什么意义呢?调用常规函数不会更简单快捷吗?

如果有人能解释的我如何实现像在C#中的线程同样的事情也将是巨大的!

在此先感谢!对不起,我的英语不好。

+2

怎么样根本就没有调用'加入()'的线程上? – nullptr 2013-05-11 16:37:26

回答

4

我能做些什么,使这个线程运行,而不会阻塞调用线程

您可以创建线程,然后就可以调用detach(),使thread对象的析构函数中赢得”如果线程尚未终止,则抛出异常。我会诚实地建议在采用这种“即燃即用”设计之前三思。在C++ 11,您可能需要调用std::async来代替(在这种情况下,你可能想看看this Q&A,其中一个解决办法,提出了该功能的当前缺点)。

一般来说(我可能错过了一些东西),为什么有人想要一个阻塞线程?那有什么意义呢?调用常规函数不会更简单快捷吗?

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

+0

谢谢你的回答!我现在明白为什么有人需要调用加入。 – UnTraDe 2013-05-11 16:42:50

+0

@UnTraDe:不客气。另外考虑一下,C++ 11有一大堆用于多线程的新原语,比如'std :: future','std :: packaged_task','std :: async()'等等,你可能想要看一下。 – 2013-05-11 16:43:52

+1

@Andy Prowl谢谢你帮我阻止我的头靠在墙上,这已经持续了一天! – TWhite 2014-08-07 21:23:15

3
  1. 不要调用join()方法。只有当你想要确保线程已经完成执行时(例如,当你销毁拥有线程的连接管理器类,你想确保线程已经完成执行时),你才加入线程。
  2. 请参阅回答何时调用join()。
+0

感谢您的回答!我没有解决我的问题,我不知道该构造函数后自动启动的线程。 – UnTraDe 2013-05-11 16:44:06