POSIX:可移植操作系统接口,是一个标准。
创建线程:如果线程创建成功,线程立刻进入就绪态,参与系统的调度,如果线程创建失败,则会释放之前线程占有的资源
int pthread_create (pthread_t *tid, const pthread_attr_t *attr,void *(*start) (void *), void *arg);
线程解绑:如有再调用则设置为解绑状态,如果没有则释放资源int pthread_detach (pthread_t thread);
分离状态为joinable的线程仅当有其他线程对其执行了pthread_join()后,它所占用的资源才会释放。因此为了避免内存泄漏,所有会结束运行的线程,分离状态要么已设为detached,要么使用pthread_join()来回收其占用的资源。
线程退出:void pthread_exit(void *value_ptr);但此时并未释放
二 互斥锁:特殊的二值信号量:在初始化时开锁=1,开锁时刻申请,使用前闭锁(lock=0),使用后再释放(unlock=1)。初始化、销毁、阻塞和非阻塞上锁(非阻塞上锁是指如果已经上锁则立即返回)、解锁。
分为普通锁(一个申请到其它进入等待队列)、嵌套锁(上锁和解锁次数形同)、检错锁(若没解锁就申请锁,错误返回。)
三条件变量(事件或标志组):配合互斥量使用。
pthread_cond_init()对条件变量初始化
pthread_cond_destroy()销毁一个条件变量
pthread_cond_wait()等待一个条件变量
指定阻塞时间的等待条件变量
int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex,const struct timespec *abstime);
pthread_cond_signal()发送一个条件变量。
int pthread_cond_broadcast(pthread_cond_t *cond);广播形式发送条件变量
四读写锁:基于互斥锁和条件变量,适合于单写多读(同一时间只能有一个写,但同一时间可以有多个读),就如同一本书,生产和消费类型。
pthread_rwlock_init()初始化一个读写锁
pthread_rwlock_wrlock()对读写锁写锁定
pthread_rwlock_rdlock()对读写锁读锁定
pthread_rwlock_destroy()销毁
五 :屏障:
屏障是多线程同步的一种方法。基于条件变量和互斥锁实现的barrier意为屏障或者栏杆,把先后到达的多个线程挡在同一栏杆前,直到所有线程到齐,然后撤下栏杆同时放行。先到达的线程将会阻塞,等到所有调用pthread_barrier_wait()函数的线程(数量等于屏障初始化时指定的count)都到达后,这些线程才会由阻塞状态进入就绪状态再次参与系统调度。
初始化后指定的等待线程个数为count个,必须对应count个线程 调用pthread_barrier_wait()。
六信号量:分为二值信号量(互斥量)和计数器信号量
sem_init()或者sem_open()给信号量值赋初值,
sem_post()函数可以让信号量值加1,
sem_wait()可以让信号量值减1
sem_t *sem_open(const char *name, int oflag, ...);
int sem_unlink(const char *name);先检查若存在则分离,在减一=0则删除
int sem_close(sem_t *sem);减一=0则删除并释放资源
int sem_getvalue(sem_t *sem, int *sval);
int sem_wait(sem_t *sem);阻塞获取
int sem_trywait(sem_t *sem);非阻塞获取
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
int sem_post(sem_t *sem);是rt_sem_release()函数的封装
六消息队列:
mqd_t mq_open(const char *name, int oflag, ...);
int mq_close(mqd_t mqdes);
int mq_unlink(const char *name);先看存在性
int mq_send(mqd_t mqdes,const char *msg_ptr, size_t msg_len,unsigned msg_prio);
int mq_timedsend(mqd_t mqdes,const char *msg_ptr,size_t msg_len,unsigned msg_prio,const struct timespec *abs_timeout);指定时间的阻塞发送
ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio);
ssize_t mq_timedreceive(mqd_t mqdes,char *msg_ptr, size_t msg_len, unsigned *msg_prio,const struct timespec *abs_timeout);
七线程属性:使用时要在线程创建之前创建线程属性对象。
线程的分离状态决定一个线程以什么样的方式来回收自己运行结束后占用的资源。线程的分离状态有2种:joinable或者detached。分离状态为detached的线程不能被其他的线程所join,自己运行结束后,马上释放系统资源
线程2中调用pthread_join(tid1,NULL);表示阻塞等待线程1结束(因接受到线程取消而结束自己运行)
7.1调度策略:int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy); int pthread_attr_getschedpolicy(pthread_attr_t const *attr, int *policy);
7.2设置调度优先级:int pthread_attr_setschedparam(pthread_attr_t *attr, struct sched_param const *param); int pthread_attr_getschedparam(pthread_attr_t const *attr, struct sched_param *param);
7.3设置线程堆栈的大小:int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stack_size); int pthread_attr_getstacksize(pthread_attr_t const *attr, size_t *stack_size);
int pthread_attr_setstack(pthread_attr_t *attr, void *stack_base, size_t stack_size);
int pthread_attr_getstack(pthread_attr_t const *attr, void **stack_base, size_t *stack_size);
7.4获取堆栈地址:int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stack_addr); int pthread_attr_getstackaddr(pthread_attr_t const *attr, void **stack_addr);
7.5线程作用域:int pthread_attr_getscope(pthread_attr_t const *attr);int pthread_attr_setscope(pthread_attr_t *attr, int scope);
7.6线程取消机制:请求取消线程的执行。当线程设置了自己的取消使能及取消状态,在别的线程发给自己取消线程时就可以执行取消动作。
int pthread_cancel(pthread_t thread);
int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
void pthread_testcancel(void);取消点也就是线程接受取消请求后会结束运行的地方
八线程结束后的清理:
void pthread_cleanup_pop(int execute);把指定的清理函数routine放到线程的清理函数链表里,
void pthread_cleanup_push(void (*routine)(void*), void *arg);从清理函数链表头部取出第一项函数,若execute为非0值,则执行此函数
int pthread_equal (pthread_t t1, pthread_t t2);线程是否相等
pthread_t pthread_self (void);获取调用线程的句柄。