泄漏std :: thread未定义的行为?

NoS*_*tAl 1 c++ multithreading c++11

有人会感兴趣的原因

  //...
 new std::thread (func,arg1,arg2);

}
Run Code Online (Sandbox Code Playgroud)

std::thread析构函数(不像boost::thread)杀死线程.func完成是一段时间.我的问题是这种情况下的安全:

情况1:假设函数按值获取arg1,arg2.
情况2:假设函数通过引用获取arg1,arg2 - 如果你问我这听起来很糟糕,因为我认为在创建线程的范围结束时arg1和arg2将被它们的析构函数清除.

BTW是std :: thread析构函数(当func完成时调用AFAIK)足够聪明地清除线程使用的所有资源?我的意思是,如果我用新的线程创建1M线程(ofc不同时)并且所有线程完成,我是否永久地泄露了什么?

Kla*_*aim 10

std :: thread对象代表一个线程,它不是一个"真正的"线程,它是由OS管理的概念.

因此,在这里你泄漏了一个std :: thread对象,因为你没有删除它.析构函数永远不会被调用. 但它所表示的线程将在它的指令结束时结束,就像任何线程一样.

如果在指令结束之前调用析构函数,例如,如果你在堆栈上创建了该对象,并且在这个新线程中有很多事情要做,那么析构函数调用将触发std :: terminate( ).您需要调用detach()以允许线程在销毁std :: thread实例后继续.

这样,当std :: thread实例被销毁时,你必须明确地说明你是否希望这个线程结束:如果你想让它继续,请调用detach(); 如果你想等待它结束,请调用join().

所以在你的情况下你泄漏了内存,但是线程应该继续,因为std :: thread对象永远存在,因为你失去了控制它的任何方法.