QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2836|回复: 8

C语言程序的线程默认堆栈空间有多大?

[复制链接]
发表于 2004-10-12 19:38:40 | 显示全部楼层 |阅读模式
还有怎么改?
发表于 2004-10-12 21:09:10 | 显示全部楼层
应该和进程的一样大吧
回复

使用道具 举报

发表于 2004-10-12 21:55:33 | 显示全部楼层
谢谢老马,纠正了一个错误认识

以前一直以为thread的栈是独立的,通过使用不同的页表来管理,仔细琢磨一下那是不可能的。

现贴段程序,在2.4内核下可以清楚的看到栈大小。
至于怎么改大小,由于栈的大小是不需要由编译程序指定,所以我认为是由内核或者pthread库管理的。

[code:1]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <unistd.h>
#include <pthread.h>

static void* threadproc(void*);
static char* tmp;

int main (int argc, char** argv)
{
        int r;
        pthread_t threadid1;
        pthread_t threadid2;
        int p;

        p = 0;
        r = pthread_create (&threadid1, NULL, threadproc, &p);
        if (r != 0) {
                printf ("pthread_create failed!\n");
                return 1;
        }
        sleep (2);
        p = 1;
        r = pthread_create (&threadid2, NULL, threadproc, &p);
        if (r != 0) {
                printf ("pthread_create failed!\n");
                return 1;
        }
        pthread_join (threadid1, NULL);
        pthread_join (threadid2, NULL);

        return 0;
}

void* threadproc (void* p)
{
        char buf[256];
        int  pis = *((int*)p);

       
       
        if (pis == 0) {
                tmp = buf;
                memset (tmp, 0, sizeof buf);
                strcpy (tmp, "I am here !\n");
                printf ("thread1: %p\n", tmp);
                sleep (4);
        }else {
                printf ("%s", tmp);
                printf ("thread2: %p\n", tmp);
                tmp = buf;
                printf ("thread2: %p\n", tmp);
        }

        sleep (3);
        return NULL;
}



[/code:1]
回复

使用道具 举报

发表于 2004-10-12 22:54:39 | 显示全部楼层
我怎么看不出什么东西啊,开始那个tmp就是应该相等,因为数据段是共享的。
书上说线程是有自己的独立堆栈和PC的啊
回复

使用道具 举报

发表于 2004-10-12 23:19:48 | 显示全部楼层
[quote:5e886cca31="roland_sun"]我怎么看不出什么东西啊,开始那个tmp就是应该相等,因为数据段是共享的。
书上说线程是有自己的独立堆栈和PC的啊[/quote]

确实是独立的,但我要说明的是在一个地址空间中,所以如果你过分的使用线程栈,例如非常深的第归调用,就可能会影响别的线程的栈
回复

使用道具 举报

发表于 2004-10-12 23:31:12 | 显示全部楼层
呵呵,对于pthread而言,都不用很深的递归,只要一个线程阻塞,其余的就不转了。
是不是两个线程buf的差值就是堆栈的大小啊?
回复

使用道具 举报

发表于 2004-10-12 23:59:53 | 显示全部楼层
[code:1]#include <pthread.h>
#include <stdio.h>
#define NTHREADS 4
#define N 1000
#define MEGEXTRA 1000000

pthread_attr_t attr;

void *dowork(void *threadid)
{
   double A[N][N];
   int i,j;
   size_t mystacksize;

   pthread_attr_getstacksize (&attr, &mystacksize);
   printf("Thread %d: stack size = %d bytes \n", threadid, mystacksize);
   for (i=0; i<N; i++)
     for (j=0; i<N; i++)
      A[i][j] = ((i*j)/3.452) + (N-i);
   pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
   pthread_t threads[NTHREADS];
   size_t stacksize;
   int rc, t;

   pthread_attr_init(&attr);
   pthread_attr_getstacksize (&attr, &stacksize);
   printf("Default stack size = %d\n", stacksize);
   stacksize = sizeof(double)*N*N+MEGEXTRA;
   printf("Amount of stack needed per thread = %d\n",stacksize);
   pthread_attr_setstacksize (&attr, stacksize);
   printf("Creating threads with stack size = %d bytes\n",stacksize);
   for(t=0; t<NTHREADS; t++){
      rc = pthread_create(&threads[t], &attr, dowork, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   printf("Created %d threads.\n", t);
   pthread_exit(NULL);
}[/code:1]取堆栈和设堆栈引自http://www.llnl.gov/computing/tutorials/pthreads/
回复

使用道具 举报

 楼主| 发表于 2004-10-15 16:15:45 | 显示全部楼层
我看到有一个pthread_attr_setstacksize函数,可以设置堆栈大小,但没有man页面,不知道注意事项。
回复

使用道具 举报

 楼主| 发表于 2004-12-2 16:25:20 | 显示全部楼层
今天看到一篇文章,终于明白默认线程栈是8M,而且pthread有溢出保护机制,但对于用户自定义栈就不做保护。除非递归的函数占用了不小的内存,或者递归深度很夸张,否则一般不会溢出吧?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 23:30 , Processed in 0.047118 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表