4

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

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

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

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

4

2 回答 2

4

我该怎么做才能使该线程运行而不阻塞调用线程

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

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

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

于 2013-05-11T16:39:46.900 回答
3
  1. 不要调用join()。仅当您想确保线程已完成执行时才加入线程(例如,当您销毁拥有线程的连接管理器类时,您要确保线程已完成执行)。
  2. 请参阅关于何时调用 join() 的答案之一。
于 2013-05-11T16:37:32.967 回答