【问题标题】:why does detach thread get no output message?为什么分离线程没有输出消息?
【发布时间】:2026-02-12 07:15:02
【问题描述】:

我正在测试如下的 cpp 代码,并得到一个非常令人困惑的现象,下面的代码不打印“标签”字符串。谁能解释一下?非常感谢您的帮助!

class Data {
public:
  Data() { std::cout << __FUNCTION__ << std::endl; }
  ~Data() { std::cout << __FUNCTION__ << std::endl; }
  void show() { std::cout << label << std::endl; }

private:
  std::string label{"label"};
};

int main() {
  auto data = std::make_shared<Data>();
  std::thread t([=]() mutable{
    data->show();
  });

  t.detach();
}

【问题讨论】:

  • 没有什么能阻止你的程序在线程有时间运行之前退出。
  • 是的,我知道使用 join() 可以获得正确的结果,但我只是想了解如果使用 detach() 会发生什么,为什么没有输出了。

标签: c++ multithreading detach


【解决方案1】:

正如 Mat 在评论部分已经提到的,没有什么可以阻止程序在线程开始之前结束。

t.detach() 更改为t.join()

来自cppreference join

等待线程完成其执行

【讨论】:

  • 谢谢。是的,我使用 detach() 的原因是试图理解分离效果。我知道我可以使用 join() 来获得正确的结果。