在Linux上为程序设置全局默认堆栈大小

Cla*_*bel 4 c c++ multithreading cross-platform

所以我注意到linux上线程的默认堆栈大小是8MB(如果我错了,请纠正我),顺便说一句,Windows上的1MB.这对我的应用来说非常糟糕,因为在4核处理器上意味着64 MB空间仅用于线程!最糟糕的是,我每个线程永远不会使用超过100kb的堆栈(我滥用堆很多;)).

我现在的解决方案是限制线程的堆栈大小.但是,我不知道如何移植.只是为了上下文,我正在使用Boost.Thread来满足我的线程需求.我很喜欢#ifdef地狱,但我想知道如何轻松地做到这一点.

基本上,我想要这样的东西(windows_*在windows版本上链接,而posix_*在linux版本下链接)

// windows_stack_limiter.c
int limit_stack_size()
{
    // Windows impl.
    return 0;
}

// posix_stack_limiter.c
int limit_stack_size()
{
    // Linux impl.
    return 0;
}

// stack_limiter.cpp
int limit_stack_size();
static volatile int placeholder = limit_stack_size();
Run Code Online (Sandbox Code Playgroud)

我如何充实这些功能?或者,或者,我只是完全错了吗?记住我无法控制实际的线程创建(在Windows上没有新的paraT到CreateThread),因为我正在使用Boost.Thread.

Ama*_*9MF 6

你不需要这样做.机器的物理内存仅在需求页面故障系统需要时才使用.即使线程堆栈明显大于您使用的数量,额外的大小也在虚拟地址空间中,并且不会占用物理RAM.

如果物理RAM以这种速率捆绑,一台典型的机器就会耗尽内存,只运行几十个进程.你可以从中看到ps -Al比同时执行更多的东西.

  • 我经常在运行几百个线程时在Linux上达到这个限制,因为它实际上耗尽了两千兆字节的进程地址空间.那时我们在启动脚本中添加了ulimit -s 1024. (2认同)