UNIX环境高级编程(十二)线程控制

来源:互联网 发布:如何清除淘宝聊天记录 编辑:程序博客网 时间:2024/05/30 05:42

12.3线程属性

可以使用pthread_attr_t结构修改线程的默认属性,并且把这些属性与创建的线程连接起来。可以使用pthread_attr_init初始化pthread_attr_t结构,调用pthread_attr_init之后,pthread_attr_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值

#inlcude<pthread.h>int pthread_attr_init(pthread_attr_t *attr)int pthread_attr_destory(pthread_attr_t * attr)//返回0表示成功,否则返回错误编号

如果要去除对pthread_attr_t结构的初始化,可以调用pthread_attr_destory函数,如果pthread_attr_init为属性对象分配了动态内存空间,pthread_attr_destory将会释放该内存空间。除此之外,pthread_attr_destory还会用无效的值初始化属性对象,因此,如果该对象被误用,将会导致pthread_create函数返回错误

此前曾经介绍过分离线程的概念。如果多某一个线程的终止状态不感兴趣的话,可以使用pthread_detach函数让操作系统在线程终止时就收回它所占的资源。

如果在线程创建时就不想了解线程的终止状态,那么可以修改pthread_attr_t结构中的detachstate线程属性让线程以分离状态启动,可以使用pthread_attr_setdetachstate函数把detachstate设置为下面两个合法值之一:设置为PTHREAD_CREATE_DETACHED,以分离状态启动;设置为PTHREAD_CREATE_JOINABLE,正常启动线程

#include<pthread.h>int pthread_attr_getdetachstate(const pthread_attr_t *attr,int *detachstaate);int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate)//若成功返回0


栈属性

#include<pthread.h>int pthread_attr_getstack(const pthread_attr_t *attr,void **stackaddr,void *stacksize)int pthread_attr_setstack(const pthread_attr_t *attr,void *stackaddr,size_t *stacksize)


如果用完了线程栈的虚拟地址空间,可以调用malloc或者mmap分配空间,并用pthread_attr_setstack来改变线程的栈位置,线程栈所占位置范围中可寻址的最低地址可以用stackaddr参数指定

也可应调用pthread_attr_getstacksize和pthread_attr_setstacksize读取和设置线程栈大小stacksize

int pthread_attr_getstacksize(const pthread_attr_t *attr,size_t *stacksize)int pthread_attr_setstacksize(pthread_attr_t attr,size_t stacksize)


更多线程属性

并发度

并发度控制着用户级线程可以映射的内核线程或进程的数目,,如果操作系统的实现在内核级的线程和用户级的线程之间保持

一对一的映射,那么改变并发度并不会有什么效果,因为所有的线程都可能被调度到,但是如果操作系统的实现让用户级线程

到内核级线程或进程之前的映射关系是多对一的话,那么在给定时间内增加可运行的用户级线程数,可能会改善性能。

pthread_setconcurrency函数可以用于提示系统,表明希望的并发度。

#inlcude<pthread.h>int pthread_getconcurrency(void)int pthread_setconcurrency(int level)


12.4同步属性

将在UNIX网络编程中介绍

12.6线程私有数据

线程私有数据是存储和查询与某个线程相关的数据的一种机制,需要私有数据的原因:
第一:

有时需要基于线程维护数据

第二:它提供了基于线程的接口适应多线程环境的机制例如:errno,以前的接口将errno定义为进程环境中全局可访问的整数。为了让线程也能够使用那些原本基于进程的系统调用和库例程,errno被设置为线程私有数据,这样一个线程设置了errno,并不会影响进程中其他线程的errno值

12.7取消选项

有两个属性并没有包含在pthread_attr_t结构中,他们是可取消状态和可取消类型。可取消属性可以是PTHREAD_CANCEL_ENABLE和PTHREAD_CANCEL_DISABLE。线程通过调用pthread_setcancelstate修改可取消状态

#inlcude<pthread.h>int pthread_setcancelstate(int state,int *oldstate)


pthread_setcancelstate函数可以把当前可取消状态设置为state,把原来的可取消状态设置为oldstate指向的内存单元中,这两步是原子操作


 

0 0