以下程序最终会失败,并显示有关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;
}
答案 0 :(得分:9)
根据线程类析构函数的cppreference:
~thread()
:销毁线程对象。如果*this
仍有关联的正在运行的主题(即joinable() == true
),则会调用std::terminate()
。
[...]已完成执行代码但尚未加入的线程仍被视为执行的活动线程,因此可以连接。
因此,在自动销毁线程变量或使用detach()
成员函数之前,必须明确地调用join()
。
答案 1 :(得分:9)
检查cppreference's std::thread
page。
已完成执行代码但尚未加入的线程仍被视为活动执行线程,因此可以加入。
[
the destructor
]销毁线程对象。如果*this
仍有关联的正在运行的帖子(即joinable() == true
),则std::terminate()
被称为。
要获得所需的行为,您需要在退出_t.detach()
之前致电main
:
[
detach()
]将执行线程与线程对象分开,允许执行独立继续。线程退出后,将释放任何已分配的资源。 在调用detach
*this
后,不再拥有任何主题。