• 生产者消费者问题


          “完成一段代码,代码有三个线程。主线程有main进入,启动一个生产者和一个消费者线程。生产者线程随机产生整数,并且把这个整数放入一个List中,消费者从List中取出数据进行显示。”(摘自淘宝校招笔试题)

          生产者-消费者问题是一个经典的线程同步问题。生产者将产品投入缓冲区,消费者从缓存区取出产品处理。很简单的一句话隐含着两个重要的内容:

    • 若缓存为空,那么消费者程序必须等待;
    • 若缓存已满,那么生产者程序必须等待。

         相应的解决办法:

    • 每个时间段只由一个线程可以使用缓存--互斥锁;
    • 缓存已满生产者等待或者缓存已空消费者等待--条件变量。

         下面是我写的一个程序以供参考:

    #include<iostream>
    #include<stdlib.h>
    #include<unistd.h>
    #include<pthread.h>
    #include<vector>
    #include<time.h>
    using namespace std;
    
    #define MAX 10             //最大缓存
    int num1=3;                //生产者个数
    int num2=5;                //消费者个数
    
    vector<int> buffer;        //缓存
    
    void *produce(void *);
    void *consume(void *);
    
    static pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
    static pthread_cond_t full=PTHREAD_COND_INITIALIZER;
    static pthread_cond_t empty=PTHREAD_COND_INITIALIZER;
    
    int main()
    {
    	buffer.clear();
    	pthread_t tid1[num1],tid2[num2];
    	int ret=0,i;
    	for(i=0;i<num1;i++)
    	{
    		if((ret=pthread_create(&tid1[i],NULL,produce,(void *)i))!=0)
    			cout<<"create thread error!
    "<<endl;
    	}
    	for(i=0;i<num2;i++)
    	{
    		if((ret=pthread_create(&tid2[i],NULL,consume,(void *)i))!=0)
    			cout<<"create thread error!
    "<<endl;
    	}
    	for(i=0;i<num1;i++)
    		pthread_join(tid1[i],NULL);
    	for(i=0;i<num2;i++)
    		pthread_join(tid2[i],NULL);
    	return 0;
    }
    
    void *produce(void *argc)
    {
    	while(1)
    	{
    		pthread_mutex_lock(&mutex);
    	    while(buffer.size()>=MAX)
    		{
    			pthread_cond_wait(&full,&mutex);
    		}
    		int temp;
    	    srand((unsigned)time(NULL));
    	    temp=rand()%100;
        	cout<<"produce    "<<pthread_self()<<":    "<<temp;
    		cout<<"    buffer大小:   "<<buffer.size()<<endl;
    	    buffer.push_back(temp);
    		usleep(1000000);
    		pthread_cond_broadcast(&empty);
    		pthread_mutex_unlock(&mutex);
    		usleep(1000000);
    	}
    }
    
    void *consume(void *argc)
    {
    	while(1)
    	{
    		pthread_mutex_lock(&mutex);
    		while(buffer.size()<=0)
    		{
    			pthread_cond_wait(&empty,&mutex);
    	    }
    		int temp;
    	    temp=buffer.back();
    	    cout<<"consume    "<<pthread_self()<<":    "<<temp;
    		cout<<"    buffer大小:    "<<buffer.size()<<endl;
    	    buffer.pop_back();
    		pthread_cond_broadcast(&full);
    		usleep(1000000);
    	    pthread_mutex_unlock(&mutex);
    	    usleep(1000000);
    	}
    }
    
  • 相关阅读:
    Union用法及说明:
    SQL用了Union后的排序问题
    10条PHP编程习惯助你找工作
    PHP性能分析工具xhprof的安装使用与注意事项
    11款数据分析工具(附体验网址)
    Linux下的库操作工具-nm、ar、ldd、ldconfig和ld.so
    ldd显示可执行模块的dependenc
    计算机图形学,三维框架设计
    dnat,snat
    百度识图API
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3585150.html
Copyright © 2020-2023  润新知