Mil*_*iad 5 c++ memory multithreading c++11 stdthread
我写了一个简单的程序,应该运行两个线程,排序小数组(~4096字节)并写入输出文件.输入数据包含在一个大文件中(~4Gb).电脑有128MB内存.我发现只运行空主函数使用14MB内存.如果使用空函数应用程序运行std :: thread,则每个线程使用~8MB.但是,如果我只做一个动态内存分配程序,每个线程开始使用大约64Mb.我不明白什么可以花这么多的记忆.我该如何控制这个尺寸?如何分配动态内存以最小化一些系统默认分配?
编译器选项:' - std = c ++ 11 -O3 -pthread '
这是一个代码示例
void dummy(void)
{
std::vector<unsigned int> g(1);
int i = 0;
while( i<500000000)
{
++i;
}
}
int main(void)
{
std::thread t1(&dummy);
std::thread t2(&dummy);
std::thread t3(&dummy);
t1.join();
t2.join();
t3.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)每个线程都有自己的堆栈.在Linux上,默认堆栈大小为8 MB.当您第一次开始分配内存时,堆内存分配器实际上可能预先保留一个大块.这可能解释了您看到的每个线程64 MB.
也就是说,当我说"已分配"时,这并不意味着这个内存真的被使用了.分配发生在进程的虚拟内存空间中.这就是你的列下看到VSZ当您运行ps或列下VIRT,当你运行top.但Linux知道你可能不会使用大部分分配的内存.因此,当您分配了一大块虚拟内存时,Linux不会分配任何物理内存来支持它,直到该进程实际开始写入该内存.进程使用的实际内存量可以在RSSfor ps和RESfor 下看到top.Linux允许分配比总共物理内存更多的虚拟内存.
即使您的物理内存可能不足,如果32位系统上有很多线程,每个线程都分配8 MB的虚拟内存,那么您的进程的虚拟内存空间可能会耗尽(大约是2 GB).虽然C++的线程库不允许您更改堆栈的大小,但C pthreads库允许您通过提供pthread_create()使用pthread_attr_t您调整的库来执行此操作pthread_attr_setstacksize().另请参阅此stackoverflow问题.
| 归档时间: |
|
| 查看次数: |
724 次 |
| 最近记录: |