文章目录

条件变量用于在线程之间同步共享数据的值。条件变量提供一种线程间的通知机制:当某个共享数据达到某个值时,唤醒等待这个共享数据的线程。

下面介绍5个主要的函数。

1
2
3
4
5
6
7
/*
引用方式: #include <pthread.h>
cond: 目标条件变量
attr: 指定条件变量的属性; 置NULL使用默认属性
返回0: 成功 || 返回错误码: 失败
*/
int pthread_cond_init(pthread_cond_t * cond, const pthread_condattr_t * attr);

pthread_cond_init函数用于初始化条件变量;此外,还可以使用如下方式来初始化一个条件变量。

1
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

宏PTHREAD_COND_INITIALIZER实际上就是将条件变量的各个字段均置0。

1
2
3
4
5
6
/*
引用方式: #include <pthread.h>
cond: 目标条件变量
返回0: 成功 || 返回错误码: 失败
*/
int pthread_cond_destroy(pthread_cond_t * cond);

pthread_cond_destroy函数用于销毁条件变量,以释放其占用的内核资源;销毁一个正在被等待的条件变量将失败并返回EBUSY。

1
2
3
4
5
6
/*
引用方式: #include <pthread.h>
cond: 目标条件变量
返回0: 成功 || 返回错误码: 失败
*/
int pthread_cond_broadcast(pthread_cond_t * cond);

pthread_cond_broadcast函数以广播的方式唤醒所有等待目标条件变量的线程。

1
2
3
4
5
6
/*
引用方式: #include <pthread.h>
cond: 目标条件变量
返回0: 成功 || 返回错误码: 失败
*/
int pthread_cond_signal(pthread_cond_t * cond);

pthread_cond_signal函数用于唤醒一个等待目标条件变量的线程。至于唤醒哪个线程,取决于线程的优先级与调度策略。

如果想要唤醒特定线程,可使用如下方法:定义一个能唯一表示目标线程的全局变量,在唤醒等待条件变量的线程前先设置该变量为目标线程,再采用广播方式唤醒所有等待条件变量的线程,这些线程被唤醒后都检查该变量以判断被唤醒的是否是自己,如果是就开始执行后续代码,否则返回继续等待。

1
2
3
4
5
6
7
/*
引用方式: #include <pthread.h>
cond: 目标条件变量
mutex: 用于保护条件变量的互斥锁
返回0: 成功 || 返回错误码: 失败
*/
int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex);

pthread_cond_wait函数用于等待目标条件变量。在调用pthread_cond_wait之前,必须确保互斥锁mutex已经加锁;pthread_cond_wait执行时,先将调用线程放入条件变量的等待队列中,再将互斥锁mutex解锁。

pthread_cond_wait函数成功返回时mutex将再次上锁。