满足条件能访问,不满足条件则阻塞等待。
互斥锁和条件变量的区别。
互斥锁 | 条件变量 |
---|---|
保护一块共享的数据 | 引起阻塞(生产者消费者模型) |
- 如果线程没有满足条件变量,线程阻塞
- 如果条件满足,阻塞的线程开始工作
#include <pthread.h>
pthread_cond_t cond;
- 初始化一个条件变量
#include <pthread.h>
int pthread_cond_init(
pthread_cond_t *restrict cond, // cond地址
const pthread_condattr_t *restrict attr // 一般为NULL
);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 也可直接通过宏来初始化
- 销毁一个条件变量
#include <pthread.h>
int pthread_cond_destroy(pthread_cond_t *cond);
- 阻塞等待一个条件变量
#include <pthread.h>
int pthread_cond_wait(
pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex
);
阻塞线程并做两件事情 - 将已经上锁的mutex解锁 - 该函数解除阻塞之时,会对互斥锁加锁
- 限时等待一个条件变量
#include <pthread.h>
int pthread_cond_timedwait(
pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime
);
下面是最关键的两个函数
- 唤醒至少一个阻塞在条件变量上的线程
#include <pthread.h>
int pthread_cond_signal(pthread_cond_t *cond);
- 唤醒全部阻塞在条件变量上的线程
#include <pthread.h>
int pthread_cond_broadcast(pthread_cond_t *cond);