【问题标题】: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 吗?或者这只是您从某个地方复制粘贴并期望工作的随机代码?

标签: c++ multithreading


【解决方案1】:

您正在线程上调用.join(),该线程会阻塞直到该线程完成,以便与该线程同时运行事物,或者在您想要并发运行的所有其他内容完成后调用join(),或者调用@改为线程对象上的 987654323@


例如

auto th = std::thread{[]() { ... }};
do_something();
th.join();

在此示例中,do_something() 将与线程 th 并发运行,或者您可以调用 detach()

std::thread{[]() { ... }}.detach();
do_something();

【讨论】:

    【解决方案2】:

    会发生这样的事情:

    1. 启动一个线程并让它运行 &Class::method

      std::thread myThread(&Class::method, this);

    2. 等到线程结束。

      myThread.join();

    3. 在当前线程中做其他事情

      //Other events

    如您所见,您的myThread.join() 暂停了您当前的线程。

    改为这样:

    std::thread myThread(&Class::method, this);
    //Other events
    myThread.join();
    

    或者;不要执行那个加入,而是打电话给myThread.detach();

    【讨论】:

    • 问题是我的程序在调用.detach()时崩溃了,是不是因为我在方法中调用了类中的元素? (像这样->值?)
    • @sh5164 我不知道你的代码是做什么的,所以无法回答。可能您有竞争条件,或者您当前的线程删除了您的其他线程正在处理的实例等。您可以在所有其他内容之后执行 .join() ,正如我的编辑所建议的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2014-08-11
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多