gpt4 book ai didi

c++ - 线程内存问题(tinythread,C++)

转载 作者:行者123 更新时间:2023-11-28 04:51:45 25 4
gpt4 key购买 nike

我调试了一个奇怪的内存问题:当一个多线程算法在一个循环中运行时,它的内存消耗随着每次迭代而增加,尽管 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。使用 Makefile 的最小测试代码: 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++ 观察到的问题。

关于c++ - 线程内存问题(tinythread,C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48074235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com