为啥 std::thread 阻塞执行?
Posted
技术标签:
【中文标题】为啥 std::thread 阻塞执行?【英文标题】:Why is std::thread blocking execution?为什么 std::thread 阻塞执行? 【发布时间】:2017-06-26 07:33:43 【问题描述】:我想让一个类方法在单独的线程中运行:
std::thread myThread(&Class::method, this);
myThread.join();
//Other events
在执行此操作时,其他事件仅在 Class:method 结束时发生,而不是同时发生。
我忘记了什么?
【问题讨论】:
join
调用阻塞,直到线程完成。在线程创建和它的 join
调用之间做一些事情。
无论你想同时执行什么代码,都应该在线程构造函数和连接之间。你没有。
你在线程上调用join
。是什么让你这样做?你读过一些docs for join
吗?或者这只是您从某个地方复制粘贴并期望工作的随机代码?
【参考方案1】:
您正在线程上调用.join
(),该线程会阻塞直到该线程完成,以便与该线程同时运行事物,或者在您想要并发运行的所有其他内容完成后调用join()
,或者调用@改为线程对象上的 987654323@
例如
auto th = std::thread[]() ... ;
do_something();
th.join();
在此示例中,do_something()
将与线程 th
并发运行,或者您可以调用 detach()
std::thread[]() ... .detach();
do_something();
【讨论】:
【参考方案2】:会发生这样的事情:
启动一个线程并让它运行 &Class::method
std::thread myThread(&Class::method, this);
等到线程结束。
myThread.join();
在当前线程中做其他事情
//Other events
如您所见,您的myThread.join()
暂停了您当前的线程。
改为这样:
std::thread myThread(&Class::method, this);
//Other events
myThread.join();
或者;不要执行那个加入,而是打电话给myThread.detach();。
【讨论】:
问题是我的程序在调用.detach()时崩溃了,是不是因为我在方法中调用了类中的元素? (像这样->值?) @sh5164 我不知道你的代码是做什么的,所以无法回答。可能您有竞争条件,或者您当前的线程删除了您的其他线程正在处理的实例等。您可以在所有其他内容之后执行 .join() ,正如我的编辑所建议的那样。以上是关于为啥 std::thread 阻塞执行?的主要内容,如果未能解决你的问题,请参考以下文章