线程的内存问题(微小线程,C++)
Memory issue with threads (tinythread, C++)
我调试了一个奇怪的内存问题:当多线程算法在循环中运行时,它的内存消耗随着每次迭代而增加,尽管GooglePerformanceTools的堆检查器说没有泄漏。最后,我制作了一个单独的最小程序来重现该错误。似乎线程是问题所在:
#include <stdio.h>
#include <iostream>
#include <vector>
#include "tinythread.h"
using namespace std;
int a(0);
void doNothingAtAll(void*)
{
++a;
}
void startAndJoin100()
{
vector<tthread::thread*> vThreads;
for(int i=0;i<100;++i)
{
vThreads.push_back(new tthread::thread(doNothingAtAll,NULL));
}
while(!vThreads.empty())
{
tthread::thread* pThread(vThreads.back());
pThread->join();
delete pThread;
vThreads.pop_back();
}
}
int main()
{
for(int i=0;i<10;++i)
{
cout<<"calling startAndJoin100()"<<endl;
startAndJoin100();
cout<<"all threads joined"<<endl;
cin.get();
}
return 0;
}
main() 调用 10 次 startAndJoin100()。它在每次迭代后等待击键,以便可以获取内存消耗(在 Ubuntu 17.10,64 位下):
VIRT
2.1 GB
4 GB
5.9 GB
7.8 GB
9.6 GB
11.5 GB
13.4 GB
15.3 GB
17.2 GB
19.0 GB
注意:C++11 不能使用,程序必须在 Linux 和 Windows 上编译,因此使用 tinythread。使用生成文件的最小测试代码: geom.at/_downloads/testTinyThread.zip
我回答我自己的问题,这可能对以后的人有用:
结论:
1)我真的很想保留TinyThread,因为C++11不可用(必须支持VS2008和旧的Linux系统),并且不能链接其他库(TinyThread仅由*.h和*.cpp文件组成,而Boost和其他我知道的解决方案需要链接DLL)。
2) Valgrind 和 GooglePerformanceTools 的堆检查器不报告内存泄漏,我已经研究了代码 - 这似乎是正确的,尽管在上面发布的最小示例中虚拟内存消耗急剧增加。似乎系统没有重用以前分配的内存页,我还没有找到这种行为的解释。因此,我不责怪TinyThread++,但是当直接使用pthreads时,它可以工作。
3)解决方法:有一个名为TinyCThread的C替代方案:https://tinycthread.github.io/也适用于C++,并且不会导致TinyThread++观察到的问题。
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 为什么std::async使用同一个线程运行函数
- 用于矢量处理的多个线程
- C++为线程工作动态地分割例程
- 为什么我不能在 while 循环中创建线程?