zoukankan      html  css  js  c++  java
  • 生产者消费者问题

          “完成一段代码,代码有三个线程。主线程有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);
    	}
    }
    
  • 相关阅读:
    Java中static、final、static final的区别(转)
    常见 重要知识精简总结
    面向对象编程三大特性------封装、继承、多态
    解决点击输入框调起键盘时,输入框被键盘遮挡的问题
    实用连接
    媒体查询兼容IE浏览器
    拖动到回收站删除
    vue2.0--组件通信
    图片上传
    上传图片预览
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3585150.html
Copyright © 2011-2022 走看看