pthread_mutex_t & pthread_cond_t 总结( 三 )


这种模型既费时又开销大,所以条件变量的产生,正是为了不循环加锁解锁,并且第一时间收到条件满足的通知 。
3.2 条件变量函数介绍3.2.1 pthread_cond_t条件变量使用特定的数据类型:pthread_cond_t 。使用条件变量前要先初始化,初始化又分为静态初始化和动态初始化:

  • 静态初始化:pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
  • 动态初始化:pthread_cond_init(&cond, NULL);
静态初始化的条件变量只能拥有默认的条件变量属性,不能设置其他条件变量属性 。
3.2.2 pthread_cond_init函数原型:int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
头  文  件:#include <pthread.h>
功         能:对条件变量初始化
返  回  值:成功返回 0,失败返回错误码
参数介绍:
  1. cond:需要初始化的条件变量
  2. attr:初始化时条件变量的属性,一般置为 NULL,表示使用默认属性
3.2.3 pthread_cond_destory函数原型:int pthread_cond_destroy(pthread_cond_t *cond);
头  文  件:#include <pthread.h>
功         能:对条件变量反初始化(在条件变量释放内存之前)
返  回  值:成功返回 0,失败返回错误码
参数介绍:需要反初始化的条件变量
备注:此函数只是反初始化互斥量,并没有释放内存空间 。如果互斥量是通过 malloc 等函数申请的,那么需要在 free 掉互斥量之前调用 pthread_mutex_destroy 函数
3.2.4 pthread_cond_wait函数原型:int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
头  文  件:#include <pthread.h>
功         能:用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast()来唤醒它
返  回  值:成功返回 0,失败返回错误码
函数 pthread_cond_wait 必须与 pthread_mutex_t 配套使用 。pthread_cond_wait() 一旦进入 wait 状态就会主动调用 pthread_mutex_unlock() 释放掉 mutex 。当其他线程通过 pthread_cond_signal() 或 pthread_cond_broadcast() 把该线程唤醒,使 pthread_cond_wait() 返回时,该线程又主动调用 pthread_mutex_lock() 来获取该 mutex 。
3.2.5 pthread_cond_signal函数原型:int pthread_cond_signal(pthread_cond_t *cond);
头  文  件:#include <pthread.h>
功         能:发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态
返  回  值:成功返回 0,失败返回错误码
使用 pthread_cond_signal 一般不会有「惊群现象」产生,它最多只给一个线程发信号 。假如有多个线程正在阻塞等待着这个条件变量的话,那么是根据各等待线程优先级的高低确定哪个线程先接收到信号并开始继续执行 。如果各线程优先级相同,则根据等待时间的长短来确定哪个线程获得信号 。但无论如何一个 pthread_cond_signal() 调用最多发信一次 。
3.2.6 pthread_cond_broadcast函数原型:int pthread_cond_broadcast(pthread_cond_t *cond);
头  文  件:#include <pthread.h>
功         能:唤醒等待该条件的所有线程
返  回  值:成功返回 0,失败返回错误码
这两个函数 pthread_cond_broadcast() 和 pthread_cond_signal 用于通知线程条件变量已经满足条件(变为真) 。在调用这两个函数时,是在给线程或者条件发信号 。

经验总结扩展阅读