为什么这个简单的线程C ++程序在退出时崩溃,除非我调用thread.join()?

时间:2014-03-27 21:13:16

标签: c++ multithreading

以下程序最终会失败,并显示有关abort()被调用的消息。

我开始一个简单打印到cout的线程。如果我使用std::this_thread::sleep_for(),我会收到错误消息。如果我删除它,我收到错误。如果我在线程上调用join(),一切正常。

在1000毫秒延迟结束之前,线程是否已经终止?为什么会导致错误?我无法相信调用join()是线程的要求。

#include <thread>
#include <iostream>

class ThreadTest
{
public:
    ThreadTest() : _t{ &ThreadTest::Run, this } {}
    void Wait() { _t.join(); }

private:

    void Run(){
        std::cout << "In thread" << std::endl;
    }

    std::thread _t;
};

int main(int argc, char *argv[])
{
    ThreadTest tt;

    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    // tt.Wait();

    return 0;
}

2 个答案:

答案 0 :(得分:9)

根据线程类析构函数的cppreference

  

~thread() :销毁线程对象。如果 *this 仍有关联的正在运行的主题(即 joinable() == true ),则会调用 std::terminate()

joinable()

  

[...]已完成执行代码但尚未加入的线程仍被视为执行的活动线程,因此可以连接。

因此,在自动销毁线程变量或使用detach()成员函数之前,必须明确地调用join()

答案 1 :(得分:9)

检查cppreference's std::thread page

  

已完成执行代码但尚未加入的线程仍被视为活动执行线程,因此可以加入。

     

[the destructor]销毁线程对象。如果*this仍有关联的正在运行的帖子(即joinable() == true),则 std::terminate()被称为

要获得所需的行为,您需要在退出_t.detach()之前致电main

  

[detach()]将执行线程与线程对象分开,允许执行独立继续。线程退出后,将释放任何已分配的资源。   在调用detach *this后,不再拥有任何主题。