我有以下代码,我觉得它可以正常工作(原谅愚蠢/做作的例子)。
void run_thread()
{
std::thread t([]{
while(true)
{
// keep getting chars... to stop peoples eye's hurting : )
char c = getchar();
}
});
t.detach(); // Detach thread
// thread goes out of scope here - but is it ok because its detached??
}
int main()
{
run_thread();
// Wait here forever
while (true) {;}
}
但重新阅读之后,我对此表示怀疑。线程t超出范围。我现在不记得你在调用detach()后这样做是否安全...我认为是这样,但正如我所说,我有一个唠叨的怀疑。任何人都可以确认这是好/坏的做法吗?
答案 0 :(得分:2)
线程t超出范围。我现在不记得是否安全 在调用detach()
之后
您detach()
因为您想要将实际运行的线程与线程对象取消关联。所以在}
t
超出范围但实际线程将继续运行直到其指令完成。
如果detach()
std::terminate
没有在}
杀死该帖子
答案 1 :(得分:2)
detach
基本上释放了std::thread
对象实例,它是实际操作系统线程的C ++“句柄”,因此以后无法join
该线程。
在大多数情况下,最好将thread
实例保留在某个全局范围内,以便以后可以join
,例如在退出main
之前。这样你就可以确保所有线程在主线程之前完成。
例如:
std::thread t; // can be "empty"
void run_thread()
{
t = std::thread([]{
while(true)
{
// keep getting chars...
char c = getchar();
}
});
}
int main()
{
run_thread();
// Wait here
std::this_thread::sleep_for(30s);
// Before exiting wait for the thread to finish
if (t.joinable())
t.join();
}
答案 2 :(得分:1)
这种用法是分离的点。
答案 3 :(得分:1)
是的,你的代码是安全的。但它没有任何意义。 main
函数将利用CPU,并且线程函数将获得更少的CPU时间。您可以附加到永久线程并达到类似行为:run_thread
永远不会退出,因此main
永远不会退出。
void run_thread()
{
std::thread t([]{
while(true){/* also run forever */;}
});
// Wait here forever
t.attach();
}
int main()
{
run_thread();
}