为啥 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 阻塞执行?的主要内容,如果未能解决你的问题,请参考以下文章

std::thread::join 无限期地阻塞在 main 之外

std::thread.join() 做啥?

终止线程c ++ 11在读取时阻塞

解除对另一个线程的阻塞

为啥说nodejs是异步非阻塞

等待 std::thread 完成