一 .创建线程
#include<pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*strart_rtn)(void*), void *restrict arg);
tidp:tidp指向的内存填写为线程ID
attr:用来设置线程属性
start_rtn:线程的执行函数
arg:执行函数start_rtn,传入参数arg
二.线程结束
线程退出
void pthread_exit(void* rval_ptr);
取消线程
int pthread_cancel(pthread_t tid);
//只是提出取消线程的请求,不等待线程终止
获取线程的退出码
int pthread_join(pthread_t thread, void **rval_ptr);
线程有三种终止方式:
1.线程执行的函数return, pthread_join获取的 rval_ptr指向的内存设置为return值
2.线程调用pthread_exit; pthread_join获取的 rval_ptr指向的内存设置为pthread_exit的参数
3.线程被取消, pthread_join获取的 rval_ptr指向的内存设置为PTHREAD_CANCELED
三 .线程属性
线程属性的初始化和销毁
初始化线程属性
int pthread_attr_init(pthread_attr_t *attr);
销毁线程属性
int pthread_attr_destroy(pthread_attr_t *attr);
分离状态属性
分离状态属性有两个合法值:
PTHREAD_CTREATE_DETACHED 和 PTHREAD_CREATE_JOINABLE
joinable状态的线程,终止后,需要其它线程调用pthread_join后才释放资(如栈)源; detached状态的线程终止后,操作系统会自动回收线程的资源,可以在线程创建或者运行时设置线程状态;
获取 分离状态属性
int pthread_attr_getdetachstate(const pthread_t *attr, int *detachstate);
设置分离状态属性
int pthread_attr_setdetachstate(pthread_t *attr, int detachstate)
分离线程
int pthread_detach(pthread_t tid);
//对已经分离的线程调用pthread_join,会产生EINVAL
线程的取消选项
线程的可取消状态可以是否PTHREAD_CANCEL_ENABLE 或者PTHREAD—CANCEL_DISABLE
设置可取消状态
int pthread_setcancelstate(int state, int *oldstate);
取消点,表示当前线程可以被取消的点;
包括一些系统调用,如accept,getmsg,msgsnd,read等;
也可以通过调用函数ptread_testcansel()设置取消点;
如果线程在PTHREAD—CANCEL_DISABLE状态时,pthread_cancel调用产生的取消请求处于未决状态,当取消状态变为PTHREAD_CANCEL_ENABLE后,在取消点上,会对未决的取消请求进行处理.
取消类型
分为延迟取消和异步取消
延迟取消是在取消点上才能被取消,异步取消则可以在任意点被取消,如果是异步类型,取消点就没用了
int pthread_setcanceltype(int type, int *oldtype);
四.互斥锁属性
属性初始化和销毁
//初始化
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
//销毁
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
互斥量的进程共享属性
属性值为 PTHREAD_PROCESS_PRIVATE 或 PTHREAD_PROCESS_SHARED
互斥量属性为PTHREAD_PROCESS_SHARED时,可以如果互斥量位于共享内存区,进程可以通过此互斥量进行同步;
获取进程共享属性
int pthread_mutexattr_getpshared(const pthread_mutexattr_t* attr, int* pshared);
设置进程共享属性
int pthread_mutexattr_setpshared(const pthread_mutexattr_t* attr, int pshared);
互斥量的类型
互斥量类型 | 同一线程没解锁时再次加锁 | 不占用时解锁 | 已解锁时解锁 |
---|---|---|---|
PTHREAD_MUTEX_NORMAL | 死锁 | 未定义 | 未定义 |
PTHREAD_MUTEX_ERRRORCHECK | 返回错误 | 返回错误 | 返回错误 |
PTHREAD_MUTEX_RECURESIVE | 允许 | 返回错误 | 返回错误 |
PTHREAD_MUTEX_DEFAULT | 未定义 | 未定义 | 未定义 |
PTHREAD_MUTEX_RECURESIVE允许同一个线程多次加锁,但是锁的释放次数要和加锁次数保持一致,否则锁不会释放
获取互斥里量类型
ing pthread_mutexattr_gettype(const pthread_mutexattr_t* attr, int* type);
设置互斥量类型
int pthread_mutexattr_settype(pthread_mutexattr_t* attr, int type);