UNIX高级编程-线程控制

来源:互联网 发布:网络显示无internet 编辑:程序博客网 时间:2024/06/06 17:55

第12章线程控制

12.1 线程的四大属性(pthread_attr_t)

Int pthread_attr_init(pthread_attr_t *attr);// 初始化线程属性

Int pthread_attr_destroy(pthread_attr_t*attr);//释放线程属性

 

如果不关心线程退出时的终止状态,只需要pthread_detach()将线程设置为分离状态,这样在该线程退出时会自动回收占有的资源

Int pthread_attr_setdetachstate(pthread_attr_t*attr,int detachstate);

Detachstate:PTHREAD_CREATE_DETACHED:分离状态启动线程

          PTHREAD_CREATE_JOINABLE正常状态启动线程

Int pthread_attr_getdetachstate(constpthread_attr_t *restrict attr,int *detachstate);//返回detachstate线程属性

 

线程栈属性查询和修改

Int pthread_attr_getstack(constpthread_attr_t *restrict attr,void **restrict stackaddr,size_t *restrictstacksize); //查询线程栈属性(包括线程栈的地址和大小)
int pthread_attr_setstack(const pthread_attr_t *attr,void *stackaddr,size_t*stacksize);//设置线程栈属性

 

线程栈的管理:

线程栈大小:当线程数量过多,致使线程栈的累计大小超过可用的虚拟地址空间时,则需要减少默认的线程栈大小;当线程调用的函数分配了大量的自动变量或者调用的函数涉及很深的栈帧时,则需要增加默认的线程栈大小。

Int pthread_attr_getstacksize(constpthread_attr_t *restrict attr,size_t *restrict stacksize);

Int pthread_attr_setstacksize(pthread_attr_t*attr,size_t stacksize);

 

如果用完了线程栈的虚拟地址空间,则需要使用malloc或者mmap为其他栈分配空间,pthread_attr_setstack函数改变新建线程的栈位置。线程栈所占内存的可寻址的最低地址可由stackaddr参数指定,与处理器结构相应的边界对齐。

 

Int pthread_attr_getguardsize(constpthread_attr_t *restrict attr,size_t *restrict guardsize);

Int pthread_attr_setguardsize(constpthread_attr_t * attr,size_t  guardsize);

警戒缓冲区大小(guardsize):避免线程栈一处的扩展内存大小,默认是PAGESIZE个字节

 

并发度:控制着用户级线程映射到内核级线程的数量

Int pthread_getconcurrency(void);//返回希望的并行度

Int pthread_setconcurrenct(int level);//设置希望的并行度,只是一个提示并不代表系统会采纳

 

12.2同步属性

1)互斥量属性

Int pthread_mutexattr_init(pthread_mutexattr_t*attr);//初始化互斥量属性

Int pthread_mutexattr_destroy(pthread_mutexattr_t*attr);//释放互斥量属性

进程共享属性:PTHREAD_PROCESS_PRIVATE 允许多线程访问同一个同步对象

              PTHREAD_PROCESS_SHARED 允许多进程访问同一个同步对象

类型属性:PTHREAD_MUTEX_NORMAL标准互斥量,不做错误检查或者死锁检测

         PTHREAD_MUTEX_ERRORCHECK提供错误检查

PTHREAD_MUTEX_RECURSIVE允许同一个线程在互斥量解锁之前对该互斥量进行多次加锁,用递归互斥量维护锁的次数,当加锁次数和解锁次数不相同时,不会释放锁。

PTHREAD_MUTEX_DEFAULT:请求默认语义

Int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrictattr,int *restrict type);  //返回互斥量的类型属性
          Int pthread_mutexattr_settype(constpthread_mutexattr_t attr,int type);//设置互斥量的类型属性

 

读写锁属性:

Int pthread_rwlockattr_init(pthread_rwlockattr_t*attr);

Int pthread_rwlockattr_destroy(pthread_rwlockattr_t*attr);

进程共享属性与互斥量的进程共享属性相同

 

条件变量属性支持进程共享属性

Int pthread_condattr_init(pthread_condattr_t*attr);

Int pthread_condattr_destroy(pthread_condattr_t*attr);

 

12.3 重入

一个函数对多个线程是可重入的,则说该函数是线程安全的

线程安全管理FILE对象的方法:

Int ftrylockfile(FILE *fp);

Void flockfile(FILE *fp);

Void funlockfile(FILE *fp);

 

12.4 线程私有数据

线程私有数据是存储和查询与某个线程相关的数据,分配线程私有数据之前,需要创建于该数据相关的键

Int pthread_key_create(pthread_key_t*keyp,void (*destructor)(void *));

Keyp:保存键

Destructor:与该建相关的析构函数,只有线程执行返回或者pthread_exit正常退出时才会调用析构函数

Int pthread_key_delete(pthread_key_t *key);//取消键与线程私有数据值之间的关联关系

Int pthread_once(pthread_once_t*initflag,void (*initfn)(void));

Void *pthread_getspecific(pthread_key_t key);

Int pthread_setspecific(pthread_key_tkey,const void *value);//将key与线程私有数据相关联

Int pthread_once(pthread_once_t*initflag,void (*initfn)(void));//初始化例程调用一次

 

12.5取消选项

Int pthread_setcancelstate(int state,int*oldstate);

State:PTHREAD_CANCEL_ENABLE(可取消状态)

    PTHREAD_CANCEL_DISABLE(不可取消状态)

Void pthread_testcancel(void);//添加取消点,当某个取消请求处于未决状态,而且取消并没有置为无效,则线程会被取消

Int pthread_setcanceltype(int type,int*oldtype);//设置可取消类型

PTHREAD_CANCEL_DEFERRED(延迟取消,当调用pthread_cancel之后,在取消点之前,线程不会执行取消操作)

PTHREAD_CANCEL_ASYNCHRONOUS(异步取消,线程可以任意时间取消)

 

12.9线程与fork

线程调用fork,为子进程创建了整个进程的地址空间的副本,fork返回后,子进程会清理锁状态,子进程内部只存在一个父进程调用fork的线程的副本

Int pthread_atfork(void (*prepare)(void),void(*parent)(void),void (*child)(void)); //fork处理程序

Prepare:在父进程调用fork()创建子进程之前,获取父进程的全部锁(注册顺序相反)

Parent:在创建子进程之后,fork返回之前在父进程环境中进行调用,解锁(注册顺序相同)

Child在fork返回之前在子进程环境中进行调用,解锁(注册顺序相同)

 


0 0