gpt4 book ai didi

c++ - 堆栈限制和线程之间的关系

转载 作者:IT王子 更新时间:2023-10-29 00:54:14 27 4
gpt4 key购买 nike

  1. ulimit -s <value之间有什么关系? > 以及 Linux 实现(或任何操作系统)中的堆栈大小(在线程级别)?

    <number of threads > * <each thread stack size > 必须小于 < stack size assigned by ulimit command > 正当理由?

  2. 在下面的程序中 - 每个线程分配 char [PTHREAD_STACK_MIN] 并创建 10 个线程。但是当 ulimit 设置为 10 * PTHREAD_STACK_MIN 时,它不会因为中止而进行 coredump。对于 stacksize 的某个随机值(远小于 10 * PTHREAD_STACK_MIN),它会进行核心转储。为什么会这样?

我的理解是,stacksize代表进程中所有线程占用的栈的总和。

线程函数

#include <cstdio>  
#include <error.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/resource.h>
using namespace std;
#include <pthread.h>
#include <bits/local_lim.h>

const unsigned int nrOfThreads = 10;
pthread_t ntid[nrOfThreads];


void* thr_fn(void* argv)
{
size_t _stackSz;
pthread_attr_t _attr;
int err;

err = pthread_attr_getstacksize(&_attr,&_stackSz);
if( 0 != err)
{
perror("pthread_getstacksize");
}

printf("Stack size - %lu, Thread ID - %llu, Process Id - %llu \n", static_cast<long unsigned int> (_stackSz), static_cast<long long unsigned int> (pthread_self()), static_cast<long long unsigned int> (getpid()) );


//check the stack size by actual allocation - equal to 1 + PTHREAD_STACK_MIN
char a[PTHREAD_STACK_MIN ] = {'0'};

struct timeval tm;
tm.tv_sec = 1;
while (1)
select(0,0,0,0,&tm);

return ( (void*) NULL);
}

主要功能

int main(int argc, char *argv[])

{

struct rlimit rlim;
int err;

err = getrlimit(RLIMIT_STACK,&rlim);
if( 0 != err)
{
perror("pthread_create ");
return -1;
}

printf("Stacksize hard limit - %ld, Softlimit - %ld\n", static_cast <long unsigned int> (rlim.rlim_max) ,
static_cast <long unsigned int> (rlim.rlim_cur));

for(unsigned int j = 0; j < nrOfThreads; j++)
{
err = pthread_create(&ntid[j],NULL,thr_fn,NULL);
if( 0 != err)
{
perror("pthread_create ");
return -1;
}
}

for(unsigned int j = 0; j < nrOfThreads; j++)
{
err = pthread_join(ntid[j],NULL);
if( 0 != err)
{
perror("pthread_join ");
return -1;
}
}

perror("Join thread success");

return 0;
}

附言:
我使用的是 Ubuntu 10.04 LTS 版本,规范如下。
Linux 笔记本电脑 2.6.32-26-generic#48-Ubuntu SMP Wed Nov 24 10:14:11 UTC 2010 x86_64 GNU/Linux

最佳答案

在 UNIX/Linux 上,getrlimit(RLIMIT_STACK) 只能保证提供主线程堆栈的大小。 OpenGroup 的引用是明确的,“初始线程的堆栈”:

http://www.opengroup.org/onlinepubs/009695399/functions/getrlimit.html

对于 Linux,有一个引用表明 RLIMIT_STACK 是任何线程堆栈(对于 NPTL 线程)默认使用的内容:

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_create.3.html

通常,由于程序员可以决定(通过在创建线程时使用非标准属性)将堆栈放在哪里和/或为新线程使用多少堆栈,因此不存在“累积进程堆栈限制”之类的东西”。它来自总 RLIMIT_AS 地址空间大小。
但是您确实对可以创建的线程数量有限制,sysconf(PTHREAD_THREADS_MAX),并且您确实对线程堆栈必须具有的最小大小有下限,sysconf(PTHREAD_STACK_MIN )

此外,您还可以查询新线程的默认堆栈大小:

pthread_attr_t attr;
size_t stacksize;
if (!pthread_attr_init(&attr) && !pthread_attr_getstacksize(&attr, &stacksize))
printf("default stacksize for a new thread: %ld\n", stacksize);

即默认初始化一组 pthread 属性并询问系统给你的堆栈大小。

关于c++ - 堆栈限制和线程之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4369078/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com