学习pthreads,管理线程的栈

7 篇文章 0 订阅
7 篇文章 5 订阅

进程的地址空间分成代码段,静态数据段,堆和栈段。线程栈的位置和大小是从它所属的进程的栈中切分出来的。每个栈必须足够大,以容纳所有对等线程的函数的执行以及它们将会调用的例程链。或许你会问为什么要进行线程栈的管理?因为栈的管理由系统自动管理。但是针对具体问题,有可能系统自动管理的栈不能满足运行的要求,这时对线程的栈的管理是必要的。本文分为三个部分,第一部分给出管理线程栈的代码示例,第二部分对代码进行讲解,第三部分给出运行结果。

一 代码示例

本例程利用线程的属性对象,获取栈的大小,并改变栈的大小。

#include "StdAfx.h"
#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#define NTHREADS 4
#define N 1000
#define MEGEXTRA 1000000
pthread_attr_t attr;
void *dowork(void *threadid)
  {
    long tid;
    size_t mystacksize;
    tid = (long)threadid;
    pthread_attr_getstacksize (&attr, &mystacksize);
    printf("Thread %ld: stack size = %li bytes \n", tid, mystacksize);
    pthread_exit(NULL);
	return(NULL);
  }
 
 int main(int argc, char *argv[])
    {
      pthread_t threads[NTHREADS];
      size_t stacksize;
      int rc;
      long t;
      pthread_attr_init(&attr);
      pthread_attr_getstacksize (&attr, &stacksize);
      printf("Default stack size = %li\n", stacksize);
      stacksize = sizeof(double)*N*N+MEGEXTRA;
      printf("Amount of stack needed per thread = %li\n",stacksize);
      pthread_attr_setstacksize (&attr, stacksize);
      printf("Creating threads with stack size = %li bytes\n",stacksize);
      for(t=0; t
      
      
     
     
    
    
   
   

二 代码讲解

pthread_attr_t attr;
void *dowork(void *threadid)
  {
    long tid;
    size_t mystacksize;
    tid = (long)threadid;
    pthread_attr_getstacksize (&attr, &mystacksize);
    printf("Thread %ld: stack size = %li bytes \n", tid, mystacksize);
    pthread_exit(NULL);
	return(NULL);
  }

定义全局属性对象变量attr,定义线程所需要执行的函数dowork,该函数通过pthread_attr_getstacksize ()获取所执行线程的栈大小,打印输出。

pthread_t threads[NTHREADS];
size_t stacksize;
int rc;
long t;
定义程序所需变量,其中stacksize是以字节为单位的变量,用于存储栈的大小。
pthread_attr_init(&attr);
pthread_attr_getstacksize (&attr, &stacksize);
printf("Default stack size = %li\n", stacksize);
使用默认值初始化属性对象变量,利用pthread_attr_getstacksize ()获取栈的大小,然后打印输出。
stacksize = sizeof(double)*N*N+MEGEXTRA;
printf("Amount of stack needed per thread = %li\n",stacksize);
pthread_attr_setstacksize (&attr, stacksize);
printf("Creating threads with stack size = %li bytes\n",stacksize);
将新的栈大小值赋给stacksize,使用pthread_attr_setstacksize (&attr, stacksize)函数设置属性对象所将要执行线程的栈大小,并打印输出。
for(t=0; t
     
     
按照属性对象创建线程,然后终止线程。
三 运行结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值