detachstat分离状态网络
int pthread_attr_getdetachstat(const pthread_attr_t *restrict_attr,int *detachstate); int pthread_attr_setdetachstat(const pthread_attr_t *restrict_attr,int detachstate);
以默认方式启动线程,在线程结束后不会主动释放占有的系统资源,要在主控线程中调用pthread_join()后才会释放。
以分离状态启动的线程,在线程结束后会自动释放所占有的系统资源。此时调用pthread_join()没法取得子线程的返回结果,此种属性在网络通信中使用的较多。数据结构
同一进程中的其它线程取消,调用pthread_cancel(ptid);多线程
成对出现,压入,弹出堆,先进后出调用自定义释放资源函数并发
一种简单的加锁方法来控制对共享资源的访问,在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程可以对共享资源进行访问。其余线程但愿上锁一个已经被锁上了互斥锁的资源,则该线程挂起,直到上锁的线程释放互斥锁为止函数
#include <pthread.h> //锁的数据结构类型 //初始化线程锁 int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restric attr); //成功则返回0, 出错则返回错误编号 //未能获取锁时,线程阻塞 int pthread_mutex_lock(pthread_mutex_t *mutex); //未能获取锁时,直接返回出错信息 int pthread_mutex_trylock(pthread_mutex_t *mutex); //释放锁 int pthread_mutex_unlock(pthread_mutex_t *mutex);
线程使用互斥锁缺少读并发性,当读操做比较多,写操做比较少,可以使用读写锁提升线和的并发性学习
//读写锁的始化 pthread_rwlock_t rwlock; /** rwlock:读写锁的pthread_rwlock_t结构指针 attr:读写锁的属性结构指针。不须要别的属性默认为NULL */ int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); //加读锁 int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); //加写锁 int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); //释放锁 int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动做:一个线程等待"条件变量的条件成立"而挂起;另外一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用老是和一个互斥锁结合在一块儿。spa
phtread_cond_t *cond; //初始化条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr) //注销条件变量 int pthread_cond_destroy(pthread_cond_t *cond) //等待与激发 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)
不管那种等待方式,都必须与互斥锁配合,以防止多个线程同时请求pthread_cond_wait()的竟态条件,且在调用pthread_cond_wait()前必须由本线程加锁,而在更新条件等待队列之前,mutex保持锁定状态,并在线线挂起进入等待前解锁,在条件知足从而离开pthread_cond_wait()以前,mutex将从新加锁,与进行pthread_cond_wait()以前状态相对应。 执行pthread_cond_wait()时自动解锁互斥量(如同执行了 pthread_unlock_mutex),并等待条件变量触发。这时线程挂起,不占用 CPU 时间,直到条件变量被触发。
所以全程能够分解成线程