c 多线程

c 多线程学习

线程建立

线程的初始化与销毁

detachstat分离状态网络

  1. PTHREAD_CREATE_JOINABLE(Default) 正常启动线程
  2. PTHREAD_CREATE_DETACHED 以分离状态启动线程
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()没法取得子线程的返回结果,此种属性在网络通信中使用的较多。数据结构

线程终止

主动终止

  1. 线程执行函数return
  2. 调用pthread_exit()

被动终止

同一进程中的其它线程取消,调用pthread_cancel(ptid);多线程

线程资源回收

成对出现,压入,弹出堆,先进后出调用自定义释放资源函数并发

  1. void pthread_cleanup_push(void (routine)(void ),void *arg);
  2. void pthread_cleanup_pop(int execute);

图片描述

线程互斥

互斥锁

一种简单的加锁方法来控制对共享资源的访问,在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程可以对共享资源进行访问。其余线程但愿上锁一个已经被锁上了互斥锁的资源,则该线程挂起,直到上锁的线程释放互斥锁为止函数

#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 时间,直到条件变量被触发。
所以全程能够分解成线程

  1. pthread_mutex_lock()上锁
  2. pthread_cond_wait()等待,等待过程分解为为:解锁--条件知足--加锁
  3. pthread_mutex_unlock()解锁
相关文章
相关标签/搜索