c++多线程之单个生产者:多个消费者

const int NUM = 50;
bool ready = false;
struct DATA
{
	int num;
};
struct node {
	DATA data[NUM];	//	定义一个大小为10的缓冲区
	int tail;
	int front;
	int count;   //记录队列长度
	condition_variable is_not_full;
	condition_variable is_not_empty;
	mutex mu;//互斥量保护缓存
	mutex mu2;//保护一个标志位
}NODE;
typedef struct node node;
bool isFull(node *q) { //判断队列是否为满

	if ((q->tail+1)%NUM== q->front)
		return true;
	else
		return false;
}

bool isEmpty(node *q) {  //判断队列是否为空

	if (q->front == q->tail)
		return true;
	else
		return false;
}
int Length(node *q)
{

	return (q->tail - q->front + NUM) % NUM;

}
void produce(node *q,int data) {
	unique_lock<mutex> locker(q->mu);
	while (isFull(q))//不为满就生产
	{
		cout << "队列已经满了,等待消费信号" << endl;
		q->is_not_full.wait(locker);//生产者等待"产品库缓冲区不为满"这一条件发生.
	}
	q->data[q->tail].num = data;
	q->tail = (q->tail + 1) % NUM;
	q->is_not_empty.notify_all();//通知消费
	locker.unlock();
}

int consumer(node *q)
{
	int data;
	unique_lock<mutex> locker2(q->mu);
	while (isEmpty(q))//不为空就消耗
	{
		cout << "队列空了,等待生产信号" << endl;
		q->is_not_empty.wait(locker2);// 消费者等待"产品库缓冲区不为空"这一条件发生.
	}
	data = q->data[q->front].num;
	q->front = (q->front + 1) % NUM;
	q->is_not_full.notify_all();//通知生产
	cout << "Consumer thread " << this_thread::get_id() << "消费了:" << data << endl;
	locker2.unlock();
	return data;
}

void produce_task() {
	for (int i = 1; ; i++) //单个生产
		{
			produce(&NODE, i);
			Sleep(1);
		
		}
}
void consumer_task() {
	int data;
	Sleep(1);
	while (1)
	{
		Sleep(7);//预留足够的时间去缓存数据
		data = consumer(&NODE);

		
	}

}


void myque_init(node *q)
{
	q->count = 0;
	q->front = 0;
	q->tail = 0;
	for (int i = 0; i < NUM; i++)
		q->data[i].num = 0;
}
int main()
{
	myque_init(&NODE);
	std::thread producer(produce_task); // 创建生产者线程.
	std::thread consumer(consumer_task); // 创建消费之线程.
	std::thread consumer2(consumer_task); // 创建消费之线程.
	std::thread consumer3(consumer_task); // 创建消费之线程.
	std::thread consumer4(consumer_task); // 创建消费之线程.
	producer.join();
	consumer.join();
	consumer2.join();
	consumer3.join();
	consumer4.join();
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/daixiangzi/article/details/80351154
今日推荐