Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
线程内存问题(tinythread,C++)_C++_Multithreading_Memory - Fatal编程技术网

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

线程内存问题(tinythread,C++),c++,multithreading,memory,C++,Multithreading,Memory,我调试了一个奇怪的内存问题:当多线程算法在循环中运行时,它的内存消耗会随着每次迭代而增加,尽管GooglePerformanceTools的堆检查器说没有泄漏。最后,我制作了一个单独的最小程序来复制这个bug。问题似乎出在线程上: #include <stdio.h> #include <iostream> #include <vector> #include "tinythread.h" using namespace std; int a(0); vo

我调试了一个奇怪的内存问题:当多线程算法在循环中运行时,它的内存消耗会随着每次迭代而增加,尽管GooglePerformanceTools的堆检查器说没有泄漏。最后,我制作了一个单独的最小程序来复制这个bug。问题似乎出在线程上:

#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;
}
注意:C++11不能使用,程序必须在Linux和Windows上编译,因此使用tinythread。使用Makefile的最小测试代码:
我回答自己的问题,这可能对以后的人有用:

结论:

1我很想保留TinyThread,因为C++11在VS2008中不可用,必须支持旧的Linux系统,并且不能链接其他库TinyThread只包含一个*.h和*.cpp文件,而Boost和我知道的其他解决方案需要链接一个DLL

2 Valgrind和GooglePerformanceTools的堆检查器没有报告内存泄漏,我已经查看了代码——虽然在上面发布的最小示例中虚拟内存消耗急剧增加,但这似乎是正确的。系统似乎没有重复使用以前分配的内存页,我也没有找到对此行为的解释。因此,我并不责怪TinyThread++,但它在直接使用pthread时起作用


3解决方法:有一个C替代方案叫做TinyCThread:它也适用于C++,它不会引起TyyTyth++的问题。p> 我认为这是Linux内核在释放内存时不取消页面映射的常见问题。这会让人觉得你有漏洞,但这是一个误报。另一方面,你有一个数据竞争,因为多个线程试图同时读写数据。这会导致未定义的行为。TinyThreads不如Pthreads常见,可移植性也不如Pthreads,在Linux上内部使用Pthreads。每个Linux系统都有pthread。所以你的可移植性只是一个幻觉。如果可移植性是一个问题,请使用它的标准库。因此,只要要求您的用户有一个C++11实现;或者继续使用在许多系统上都可用的Pthread。在短时间阅读timythread的代码后,它看起来像是在Linux上使用了Pthread,因此如果你用Pthread编写相同的测试代码,它仍然会给出相同的结果bug report ubuntu,如果它现在不这样做bug report tinythread。

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