生产者消费者问题

      “完成一段代码,代码有三个线程。主线程有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!\n"<<endl;
	}
	for(i=0;i<num2;i++)
	{
		if((ret=pthread_create(&tid2[i],NULL,consume,(void *)i))!=0)
			cout<<"create thread error!\n"<<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);
	}
}

 

posted @ 2014-03-06 19:26  七年之后  阅读(369)  评论(0编辑  收藏  举报