在作用域中,我创建了一个包含线程的对象。线程在对象c-tor中分离。最后我删除了该对象,但在释放相关的对象内存后,线程仍在继续。分离的线程是保存对象副本还是仅引用程序堆栈,这将被进一步删除?
struct test_detach {
test_detach()
: thr_(&test_detach::loop, this) {
thr_.detach();
}
void loop() {
while(true) {
cout << "loop test" << endl;
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
std::thread thr_;
};
int main()
{
{
test_detach *test = new test_detach;
std::this_thread::sleep_for(std::chrono::seconds(1));
delete test;
}
cout << "Sleep" << endl;;
std::this_thread::sleep_for(std::chrono::seconds(3));
cout << "Finish!" << endl;;
return 0;
}
节目输出:
loop test
loop test
Sleep
loop test
loop test
loop test
loop test
loop test
loop test
Finish!
答案 0 :(得分:1)
线程一直持续到程序终止。您的线程不使用特定test_detach
结构的任何数据字段,因此没有SEGFAULT。但是,如果您将一个成员变量添加到结构中并尝试从主线程结构delete
d后从分离的线程访问它,则可能会导致SEGFAULT / undefined行为等。test_detach
结构位于堆上。它不会被复制到任何地方,这就是重点。但是:
void loop() {
int x = 0;
while(true) {
cout << "loop test, x: " << x++ << endl;
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
将正常工作,因为x位于为特定线程维护的堆栈上。