因此,假设我有一个正在运行的线程,并且我希望线程外部的其余代码能够运行,而不必担心线程的join()函数会阻塞代码。执行以下操作是否安全:
thread someThread([&someVariable]{ ThreadCode(someVariable); someThread.detach();});while(1){ RestOfMyCode();}
thread someThread([&someVariable]
{
ThreadCode(someVariable);
someThread.detach();
});
while(1)
RestOfMyCode();
}
目前我使用标志来检查线程是否仍在运行,但我觉得上面的代码会更容易阅读/hot
yhxst69z1#
通常使用detach是设计不好的标志。看这个topic。除此之外,如果线程在main返回后无法调用detach,那么代码可能会导致std::terminate。看看这个example。如果你想“开火后就忘了”,只要把你的std::thread保存在你的主例程可以访问的某个上下文中,只要你完成了你的主任务,就可以用join。如果线程提前完成,没什么大不了的。如果它还在运行,你的主程序将只是等待它,它可能无论如何都应该这样做,因为保留一个父线程已经死了的子线程沿着资源有什么意义呢?
detach
main
std::terminate
std::thread
join
bxpogfeg2#
分离线程的方式可能会导致悬空引用,因为主线程可能会在线程完全执行之前完成其执行。根据我的经验,您应该使用一个共享的标志变量来获得更好的方法
7nbnzgx93#
代码是正确的,尽管应用程序设计可能不好。POSIX pthread_detach()手册中有它在调用线程中的用法示例:
pthread_detach()
pthread_detach(pthread_self());
你的代码就是这么做的。
3条答案
按热度按时间yhxst69z1#
通常使用
detach
是设计不好的标志。看这个topic。除此之外,如果线程在main
返回后无法调用detach
,那么代码可能会导致std::terminate
。看看这个example。如果你想“开火后就忘了”,只要把你的
std::thread
保存在你的主例程可以访问的某个上下文中,只要你完成了你的主任务,就可以用join
。如果线程提前完成,没什么大不了的。如果它还在运行,你的主程序将只是等待它,它可能无论如何都应该这样做,因为保留一个父线程已经死了的子线程沿着资源有什么意义呢?bxpogfeg2#
分离线程的方式可能会导致悬空引用,因为主线程可能会在线程完全执行之前完成其执行。根据我的经验,您应该使用一个共享的标志变量来获得更好的方法
7nbnzgx93#
代码是正确的,尽管应用程序设计可能不好。POSIX
pthread_detach()
手册中有它在调用线程中的用法示例:你的代码就是这么做的。