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


    在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("生产者生产了一件产品!!!
    ");
    		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("消费者消费了一件产品!!!
    ");
    		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;
    }
  • 相关阅读:
    【转】异或
    【算法习题】正整数数组中和为sum的任意个数的组合数
    mysql通过now()获取的时间不对
    【转】CentOS 7系统时间与实际时间差8个小时
    【算法习题】数组中任意2个(3个)数的和为sum的组合
    linux编译安装python3和安装django
    linux常见命令2
    解决安装centos的时候忘记打开网络的问题
    linux常见命令
    python3X和python2X的区别
  • 原文地址:https://www.cnblogs.com/FJuly/p/4728275.html
Copyright © 2020-2023  润新知