Linux多线程学习(三)线程属性

 一、属性

      线程的创建函数pthread_creat的第二个参数为pthread_attr_t类型的指针(默认属性创建线程时赋值NULL),pthread_attr_t是一个结构体类型,定义如下:

typedef struct
{
   int                  detachstate;       //线程的分离状态
   int                  schedpolicy;       //线程调度策略
   struct sched_param   schedparam;        //线程的调度参数
   int                  inheritsched;      //线程的继承性
   int                  scope;             //线程的作用域
   size_t               guardsize;         //线程栈末尾的警戒缓冲区大小
   int                  stackaddr_set;     //堆栈的地址集
   void *               stackaddr;         //线程栈的位置
   size_t               stacksize;         //线程栈的大小
}pthread_attr_t;

线程属性的使用步骤:创建属性对象--->以默认值初始化属性对象--->给属性对象赋值--->作为参数传给pthread_create()函数。

示例:以设置线程的分离状态为例,线程的分离状态取值有两种:

PTHREAD_CREATE_JOINABLE 0

PTHREAD_CREATE_DETACHED 1

二、编程练习

创建线程属性后,先以默认值对属性初始化,初始化成功后,读取一次线程的分离状态(默认是非分离状态),打印结果应该为0;接下来对线程的分离状态重新赋值,设为分离状态,在thread的入口函数中,再读一次线程的分离状态,若前面设置成功,则读出来的结果应该为1。

#include 
#include 
#include 
#include 
#include 

pthread_attr_t attr;

void *pthread_test(void * pra)
{
	int  res;
	int  detachstate;
    //获取线程的分离状态
    res = pthread_attr_getdetachstate(&attr, &detachstate);
	if(res)
	{
		printf("getdetachstate fail...\r\n");
		exit(-1);
	}
	printf("thread detachstatus is %d\r\n",detachstate);
	pthread_exit(NULL);
}


int main(void)
{
	int res;
	int  detachstate;
	pthread_t thread;
	
	
    //初始化线程属性
    res = pthread_attr_init(&attr);
	if(res)
	{
		printf("thread attr init fail\r\n");
		exit(-1);
	}
	
    //获取线程的分离状态
    res = pthread_attr_getdetachstate(&attr, &detachstate);
	if(res)
	{
		printf("getdetachstate fail...\r\n");
		exit(-1);
	}
	printf("thread detachstatus is %d\r\n",detachstate);
	
    //设置线程为分离状态,默认是非分离状态
    res = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
	if(res)
	{
		printf("setdetachstate fail...\r\n");
		exit(-1);
	}
	
    res = pthread_create(&thread,&attr,pthread_test,NULL);
	if(res)
	{
		printf("thread create fail\r\n");
		exit(-1);
	}
	
	pthread_exit(NULL);
	
	return 0;
}

运行结果:

你可能感兴趣的:(Linux多线程学习(三)线程属性)