Skip to content

Latest commit

 

History

History
86 lines (59 loc) · 1.55 KB

条件变量.md

File metadata and controls

86 lines (59 loc) · 1.55 KB

条件变量

满足条件能访问,不满足条件则阻塞等待。

互斥锁和条件变量的区别。

互斥锁 条件变量
保护一块共享的数据 引起阻塞(生产者消费者模型)
  • 如果线程没有满足条件变量,线程阻塞
  • 如果条件满足,阻塞的线程开始工作

条件变量类型

#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);