这是一个简单的例子。
#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
!我知道这不是常驻内存,但这对于单个线程创建来说仍然是巨大的内存量。
创建一个线程真的需要如此消耗内存吗?这可以进行配置吗?
或者,最有可能的是,我对虚拟内存有一些误解?
详细信息:
我使用以下方法双重检查了内存使用情况:
- 生成正在运行的 exe 的
core dump
,大小也为 1.6GB; valgrind --tool=massif
也确认了这个大小;pmap -x <pid>
也确认了这个大小。
由于这个大小与堆栈的最大大小相匹配(也被 /proc/<pid>/limits
确认),我尝试将堆栈的最大大小缩小。试过 1 MiB,但没有改变任何东西。
请暂时忽略创建和使用 192 个线程,这是有原因的。
抱歉混淆了 C 和 C++ - 最初尝试使用 std::thread
,结果是相同的。