首页 > 解决方案 > C ++多次声明相同的线程变量(在循环中)

问题描述

我想知道如果我这样做会发生什么:

void afunction(/*parameters*/) { /*do something*/ }

// And then in main... 

while(1) {
    thread aThread(afunction, /*parameters*/);
    athread.detatch();
    sleep(1);
}

这是否会创建无限数量的线程(直到系统崩溃)?或者它会在 1 秒后覆盖旧线程(比如杀死线程并创建一个新线程)?有什么问题我需要担心吗?

标签: c++multithreadingthread-safety

解决方案


前者。

特别是,当控制进入 while-loop-body 的范围时, thread对象aThread被创建,并且由它的构造函数产生一个新的 OS 线程(注意我在这里假设您正在使用std::thread而不是其他一些线程类)。

然后调用detach()线程对象,因此操作系统线程不再与aThread对象关联,但它仍在运行。

然后在一秒延迟后,到达作用域的尽头,因此aThread对象被销毁,但由于操作系统线程与aThread对象分离,操作系统线程继续自行运行。

然后再次进入作用域以进行 while 循环的下一次迭代,整个过程无限期地重复。

一般来说,最好调用join()你的线程而不是detach(),因为这将允许你的程序进行有序的关闭。没有join(),就很难或不可能安全地拆除进程范围的资源,因为您不能保证仍在运行的线程在拆除发生时可能不在使用这些资源。因此,大多数编写良好的多线程程序将join()在 结束之前调用所有当前正在运行的线程,main()如果不是更早的话。


推荐阅读