【发布时间】:2019-02-19 10:22:51
【问题描述】:
这是一个简单的例子
#include <iostream>
#include <thread>
#include <vector>
#include <chrono>
void* run(void*)
{
while (true)
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
std::vector<pthread_t> workers(192);
for (unsigned i = 0; i < workers.size(); ++i)
pthread_create(&workers[i], nullptr, &run, nullptr);
pthread_join(workers.back(), nullptr);
}
top 显示1'889'356 KiB VIRT!我知道这不是常驻内存,但对于单线程创建来说,这仍然是巨大的内存量。
创建一个线程真的那么耗费内存(在这种情况下是 8MiB)吗?这是可配置的吗?
或者,也许而且很可能,我对虚拟内存是什么有一些误解?
详情:
我两次检查了内存使用情况,使用:
- 生成了一个正在运行的exe的
core dump,也是1.6GB; -
valgrind --tool=massif也确认了这个尺寸; -
pmap -x <pid>也确认了大小。
由于这个大小与堆栈的最大大小相匹配(也由/proc/<pid>/limits 确认),我试图使堆栈的最大大小更小。尝试使用 1 MiB,但这并没有改变任何东西。
拜托,192个线程的创建和使用,是有原因的。
对不起,混合了 C 和 C++ - 最初尝试使用 std::thread,结果是一样的。
【问题讨论】:
标签: linux multithreading memory memory-management virtual-memory