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

问题描述 投票:3回答:1

这是一个简单的例子

#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
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);
}
© www.soinside.com 2019 - 2024. All rights reserved.