分类: LINUX
2013-06-07 14:54:03
这里说的线程属性不包括实时线程里的线程属性
并且后面的测试都忽略了错误检查
如同线程的同步对象 互斥量,读写锁一样。线程的属性也需要初始化和去初始化(回收资源)
pthread_attr_init(pthread_attr_t *attr);
初始化为线程默认属性
pthread_attr_destroy(pthread_attr_t *attr);
去初始化
线程属性大致分为两种:
一种是pthread_attr_t 结构中包含的属性:
1 线程的分离状态属性
2 线程栈末尾的境界缓冲区大小
3 线程栈的最低地址
4 线程栈的大小
另一种是不在pthread_attr_t 结构中的属性
1 可取消状态
2 可取消类型
3 并发度
下面来一一介绍这些属性。
线程的分离状态属性:如果我们事先知道对某个线程的终止状态不感兴趣,则可以修改pthread_attr_t结构
中的 线程分离属性。让线程以分离状态启动。这样线程结束时,资源就会自动被释放,而不需要
主线程调用pthread_join来获得(如果需要)并释放。
线程分离属性可以设置为下面两个值 :
PTHREAD_CREATE_DETACHED 以分离状态启动线程,程序中调用pthread_join来获得他的终止状态时会出错。
PTHREAD_CREATE_JOINABLE 正常启动线程,应用程序中可以调用pthread_join来获得线程终止状态。(线程默认启动方式)
int pthread_attr_getdetachstate(const pthread_attr_t *restricr attr,
int *detachstate);
用来获得当前的 分离状态属性。
int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);
用来设置 分离状态属性
下面我们来看个例子:
我们想创建两个线程。第一个线程用默认线程属性创建。然后试图调用pthread_join去等待
应为默认属性是 JOINABLE 所以第一个线程我们期望pthread_join调用成功
然后我们将 attr 属性中的线程分离属性设置为DETACHED,然后再调用pthread_join.我们期望这时候
pthread_join调用会失败。
void *th1(void *arg){
printf("thread1 start:\n");
printf("thread1 done\n");
pthread_exit((void *)0);
}
void *th2(void *arg){
printf("thread2 start:\n");
printf("thread2 done\n");
pthread_exit((void *)0);
}
int main(void){
pthread_t tid1,tid2;
pthread_attr_t attr;
int detachstate;
int err;
pthread_attr_init(&attr);
pthread_attr_getdetachstate(&attr,&detachstate); //获取默认的 属性
if(detachstate==PTHREAD_CREATE_JOINABLE){
printf("detachstate:JOINABLE\n");
}else{
printf("detachstate:DETACHED\n");
}
pthread_create(&tid1,&attr,th1,(void *)0); //以默认状态启动
if((err=pthread_join(tid1,NULL))!=0){//测试能否调用
printf("pthread_join error:%s\n",strerror(err));
exit(1);
}else{
printf("pthread_join successful\n");
}
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); //设置为线程分离属性设置为分离
printf("\nNow:\n");
pthread_attr_getdetachstate(&attr,&detachstate);
if(detachstate==PTHREAD_CREATE_JOINABLE){
printf("detachstate:JOINABLE\n");
}else{
printf("detachstate:DETACHED\n");
}
pthread_create(&tid2,&attr,th2,(void *)0);//以分离方式启动线程
pthread_attr_destroy(&attr);//回收分配给属性的资源
if((err=pthread_join(tid2,NULL))!=0){//测试能否调用
printf("pthread_join error:%s\n",strerror(err));
exit(1);
}else{
printf("pthread_join successful\n");
}
exit(0);
}
程序输出如下:
detachstate:JOINABLE
thread1 start:
thread1 done
pthread_join successful
Now:
detachstate:DETACHED
pthread_join error:Invalid argument
输出正如我们预料的。也验证了 分离线程属性的作用