gpt4 book ai didi

C++分离线程在其关联对象被删除后继续工作

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:15 25 4
gpt4 key购买 nike

在一个范围内,我创建了一个对象,其中包含一个线程。线程在对象 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!

最佳答案

好吧,线程会继续运行,直到程序终止。您的线程不使用特定 test_detach 结构的任何数据字段,因此不存在 SEGFAULT。但是,如果您向结构中添加一个成员变量,并在该结构从主线程中删除d 后尝试从分离线程访问它,则可能会导致 SEGFAULT/未定义行为等。 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 在为特定线程维护的堆栈上。

关于C++分离线程在其关联对象被删除后继续工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24306164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com