c++ 在线程自己的回调中分离线程是否安全?

ffscu2ro  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(196)

因此,假设我有一个正在运行的线程,并且我希望线程外部的其余代码能够运行,而不必担心线程的join()函数会阻塞代码。执行以下操作是否安全:

  1. thread someThread([&someVariable]
  2. {
  3. ThreadCode(someVariable);
  4. someThread.detach();
  5. });
  6. while(1)
  7. {
  8. RestOfMyCode();
  9. }

目前我使用标志来检查线程是否仍在运行,但我觉得上面的代码会更容易阅读/hot

yhxst69z

yhxst69z1#

通常使用detach是设计不好的标志。看这个topic。除此之外,如果线程在main返回后无法调用detach,那么代码可能会导致std::terminate。看看这个example
如果你想“开火后就忘了”,只要把你的std::thread保存在你的主例程可以访问的某个上下文中,只要你完成了你的主任务,就可以用join。如果线程提前完成,没什么大不了的。如果它还在运行,你的主程序将只是等待它,它可能无论如何都应该这样做,因为保留一个父线程已经死了的子线程沿着资源有什么意义呢?

bxpogfeg

bxpogfeg2#

分离线程的方式可能会导致悬空引用,因为主线程可能会在线程完全执行之前完成其执行。根据我的经验,您应该使用一个共享的标志变量来获得更好的方法

7nbnzgx9

7nbnzgx93#

代码是正确的,尽管应用程序设计可能不好。POSIX pthread_detach()手册中有它在调用线程中的用法示例:

  1. pthread_detach(pthread_self());

你的代码就是这么做的。

相关问题