Multithreading 处理std::螺纹c和x2B中的泄漏+;

Multithreading 处理std::螺纹c和x2B中的泄漏+;,multithreading,visual-c++,handle,Multithreading,Visual C++,Handle,今天我在使用std::thread时注意到一个奇怪的想法。这是最小的测试用例: void test() { std::thread t1([] {}); t1.join(); } 每次我运行此代码时,都会有一个句柄泄漏 这是ProcessExplorer中的视图。这些泄漏的句柄是线程互斥体“BaseNammedObjects\bx\u thread\u mutex” 这些互斥锁不会在将来的任何时候发布。这是一个众所周知的问题吗 我正在使用最新的Visual Studio

今天我在使用std::thread时注意到一个奇怪的想法。这是最小的测试用例:

void test() 
{
    std::thread t1([] {}); 
    t1.join();
}
每次我运行此代码时,都会有一个句柄泄漏

这是ProcessExplorer中的视图。这些泄漏的句柄是线程互斥体“BaseNammedObjects\bx\u thread\u mutex”

这些互斥锁不会在将来的任何时候发布。这是一个众所周知的问题吗

我正在使用最新的Visual Studio 2019 16.7.3,并在32位应用程序(调试和发布)上进行测试

编辑:

泄漏的句柄与执行次数成线性关系,因此此代码段:

for (int n = 0; n < 1000; n++)
{
    std::thread t1([] {});
    t1.join();
}
for(int n=0;n<1000;n++)
{
std::线程t1([]{});
t1.join();
}

创建1000个泄漏句柄:

很抱歉出现半假警报

这个问题似乎是由用于内存泄漏检测的第三方插件Deleaker(我现在正在测试)引起的(很有趣,对吧?;-)

当我禁用这个插件时,一切正常。所以这是德莱克在里面做的事情。我将向作者报告这一问题

编辑:最新版本的Delaker似乎解决了这个问题


如何构建代码?调试还是发布?我尝试了两种方法,但结果相同。这些方法的数量是否与线程的数量成比例?比如说,1000个线程会产生N*1000个这样的结果吗?我很好奇它们是否是
std::thread
子系统使用的某种类型的池,并且是循环使用的,但不会低于某个特定的计数来保留一些。奇怪的是,我用boost::thread而不是std::thread尝试了它,其行为完全相同。@tadman这是一个线性的。当我将其循环1000次以上时,会出现1000个新的泄漏。@TanveerBadar尚未;-)“您可以在15小时内接受自己的答案”