使用shared_mutex的内存泄漏

Pla*_*rte 5 c++ mutex memory-leaks c++17

以下代码导致内存使用率的增加:

#include <shared_mutex>

class foo
{
public:
   void bar()
   {
      std::unique_lock lock(m_mtx);
   }
   std::shared_mutex m_mtx;
};

int main()
{
   while (1)
   {
      foo obj;
      obj.bar();
   }
}
Run Code Online (Sandbox Code Playgroud)

以下内容不:(仅更改互斥锁类型)

#include <mutex>

class foo
{
public:
   void bar()
   {
      std::unique_lock lock(m_mtx);
   }
   std::mutex m_mtx;
};

int main()
{
   while (1)
   {
      foo obj;
      obj.bar();
   }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Windows 7,并使用任务管理器来跟踪程序的内存消耗。

我用mingw和这个简单的命令行来编译:

g++.exe -std=c++17 -o mytest main.cpp
Run Code Online (Sandbox Code Playgroud)

我对shared_mutex的使用做错了什么?

小智 1

找到了!很老的帖子了,不知道对你是否还有用。

问题似乎是使用 g++、mingw64 和std::shared_mutex(至少版本 12-posix)。

事实上,使用标准头文件的 C++ 库中存在内存泄漏<shared_mutex>。当用于初始化互斥锁时,不会pthread_rwlock_destroy调用。PTHREAD_RWLOCK_INITIALIZER但是,pthread_rwlock_destroy在使用该版本时会按预期调用pthread_rwlock_init

我找到了解决方法和解决办法。PTHREAD_RWLOCK_INITIALIZER最简单的方法是从源代码中“禁用”常量初始值设定项;这会强制 C++ 库调用该pthread_rwlock_init函数,然后再调用该pthread_rwlock_destroy函数。为此,只需在和#undef之间插入一个:#include <pthread>#include <mutex>

#include <thread>
#undef PTHREAD_RWLOCK_INITIALIZER
#include <mutex>
#include <shared_mutex>
Run Code Online (Sandbox Code Playgroud)

正确的方法是修补<shared_mutex>C++标准库的头文件并在析构函数pthread_rwlock_destroy中调用该函数,即使使用shared_mutex常量初始值设定项也是如此。PTHREAD_RWLOCK_INITIALIZER

如果我找到方法和时间,我将提交标准<shared_mutex>头文件的常规补丁。