条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。
使用STL标准库queue队列
入队—模仿生产
出队—模仿消费
pthread_cond_wait函数
阻塞等待一个条件变量
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
函数作用:
1.阻塞等待条件变量cond(参1)满足
2.释放已掌握的互斥锁(解锁互斥量)相当于pthread_mutex_unlock(&mutex);
1.2.两步为一个原子操作。
3.当被唤醒,pthread_cond_wait函数返回时,解除阻塞并重新申请获取互斥锁pthread_mutex_lock(&mutex);
pthread_cond_signal函数
唤醒至少一个阻塞在条件变量上的线程
int pthread_cond_signal(pthread_cond_t *cond);
pthread_cond_broadcast函数
唤醒全部阻塞在条件变量上的线程
int pthread_cond_broadcast(pthread_cond_t *cond);
一个生产者,一个消费者
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <queue>
using namespace std;
pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
queue<int>my_Queue; //产品队列
void *consumer(void *p)
{
for (;;) {
pthread_mutex_lock(&lock);
while (my_Queue.empty()) {
pthread_cond_wait(&has_product, &lock);
}
//模拟消费掉一个产品
int num=my_Queue.front(); //获取队头元素
my_Queue.pop();//出队
pthread_mutex_unlock(&lock);
printf("-Consume ---%d, now total = %lu\n", num,my_Queue.size(