这是一个简单的例子
#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)?这是可配置的吗?
或者,也许而且很有可能,我对虚拟内存是什么有所误解?
详细信息:
我使用以下方法对内存使用量进行了四重检查:
core dump
的正在运行的exe,它也是1.6GB; valgrind --tool=massif
还会确认此大小; pmap -x <pid>
还会确认大小。由于此大小与堆栈的最大大小匹配(也由/proc/<pid>/limits
确认),因此我尝试减小堆栈的最大大小。尝试使用1 MiB,但这没有任何改变。
请抛开192个线程的创建和使用,这是有原因的。
很抱歉,混合使用C和C ++-最初尝试使用std::thread
,结果是相同的。
答案 0 :(得分: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);
}