在Linux中,pthread_create分配了大量的内存?

3
这是一个简单的例子。
#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 KiBVIRT!我知道这不是常驻内存,但这对于单个线程创建来说仍然是巨大的内存量。

创建一个线程真的需要如此消耗内存吗?这可以进行配置吗?

或者,最有可能的是,我对虚拟内存有一些误解?


详细信息:

我使用以下方法双重检查了内存使用情况:

  • 生成正在运行的 exe 的 core dump,大小也为 1.6GB;
  • valgrind --tool=massif 也确认了这个大小;
  • pmap -x <pid> 也确认了这个大小。

由于这个大小与堆栈的最大大小相匹配(也被 /proc/<pid>/limits确认),我尝试将堆栈的最大大小缩小。试过 1 MiB,但没有改变任何东西。

请暂时忽略创建和使用 192 个线程,这是有原因的。

抱歉混淆了 C 和 C++ - 最初尝试使用 std::thread,结果是相同的。

1个回答

1

pthread_attr_setstacksize()函数可用于设置堆栈大小。 必须使用线程属性对象来调用此函数。 线程属性对象必须作为pthread_create()的第二个参数传递。

#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);
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setstacksize(&attr, 16384);

    for (unsigned i = 0; i < workers.size(); ++i)
        pthread_create(&workers[i], &attr, &run, nullptr);

    pthread_join(workers.back(), nullptr);
}

哦,该死,真的有效!所以,它确实需要这么多内存,而且确实是因为堆栈大小。谢谢,感激不尽! - Kiril Kirov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接