以下代码会导致内存使用量增加:
#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();
}
}
以下内容不会:(仅更改互斥体类型)
#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();
}
}
我使用 Windows 7 并使用任务管理器来跟踪程序的内存消耗。
我用 mingw 和这个简单的命令行进行编译:
g++.exe -std=c++17 -o mytest main.cpp
我使用shared_mutex做错了什么?
找到了!很旧的帖子,不知道它是否仍然适合你。
问题似乎出在使用 g++、mingw64 和标准共享互斥体(至少版本 12-posix)。
事实上,使用标准头文件shared_mutex的C++库中存在内存泄漏。当使用 PTHREAD_RWLOCK_INITIALIZER 初始化互斥锁时,不会调用 pthread_rwlock_destroy。但是,使用 pthread_rwlock_init 版本按预期调用 pthread_rwlock_destroy。
我找到了解决办法和解决办法。最简单的方法是从源代码中“禁用”常量初始值设定项 PTHREAD_RWLOCK_INITIALIZER。它强制 C++ 库调用 pthread_rwlock_init 函数,然后调用 pthread_rwlock_destroy 函数。为此,只需在 #include
#include <thread>
#undef PTHREAD_RWLOCK_INITIALIZER
#include <mutex>
#include <shared_mutex>
正确的方法是修补C++标准库的shared_mutex头文件,并在shared_mutex析构函数中调用pthread_rwlock_destroy函数,即使使用常量初始值设定项PTHREAD_RWLOCK_INITIALIZER也是如此。 如果我找到方法和时间,我将提交标准共享互斥头文件的常规补丁。