使用条件量解决生产者消费者问题

在linux多线程同步中,除了互斥量以外,pthread提供了另一种同步机制:条件变量。正如名字一样,条件量允许线程由于一些未达到的条件而阻塞。

条件变量与互斥量经常一起使用。这种模式用于让一个线程锁住一个变量,然后当它不能获得它期待的结果时等待一个条件变量。最后另一个线程会向他发出信号,使它可以继续执行。pthread_cond_wait原子性地调用并解锁它持有的互斥量。由于这个原因,互斥量是参数之一。

下面通过代码演示如何通过条件量来解决生产者消费者问题。

#include<stdio.h>
#include<pthread.h>
#define MAX 100
pthread_mutex_t the_mutex;
pthread_cond_t condc,condp;
int buffer=0;//这里为了方面,将缓冲区定为1

void *producer(void *ptr)//生产数据
{
	int i;
	for(i=1;i<=MAX;i++)
	{
		pthread_mutex_lock(&the_mutex);//互斥使用缓冲区
		while(buffer!=0)
		{
			pthread_cond_wait(&condp,&the_mutex);	
		}
		buffer=i;
		printf("生产者生产了一件产品!!!\n");
		pthread_cond_signal(&condc);
		pthread_mutex_unlock(&the_mutex);
	}
	pthread_exit(0);
}	

void *consumer(void *ptr)//消费数据
{
	int i;
	for(i=1;i<MAX;i++)
	{
		pthread_mutex_lock(&the_mutex);//互斥使用缓冲区
		while(buffer==0)
		{
			pthread_cond_wait(&condc,&the_mutex);	
		}
		buffer=0;
		printf("消费者消费了一件产品!!!\n");
		pthread_cond_signal(&condp);
		pthread_mutex_unlock(&the_mutex);
	}
	pthread_exit(0);
}
int main()
{
	pthread_t pro,con;
	pthread_mutex_init(&the_mutex,0);
	pthread_cond_init(&condc,0);
	pthread_cond_init(&condp,0);
	pthread_create(&con,0,consumer,0);
	pthread_create(&pro,0,producer,0);
	pthread_join(pro,0);
	pthread_join(con,0);
	pthread_cond_destroy(&condc);
	pthread_cond_destroy(&condp);
	pthread_mutex_destroy(&the_mutex);
	return 0;
}

转载于:https://www.cnblogs.com/FJuly/p/4728275.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值