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>头文件的常规补丁。
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |