C++ 生产者消费者

写了一个最简单的生产者消费者模式

以供初学者的学习使用

#include <iostream>
#include <deque>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;

const int bufsize = 10;
const int total = 100;

mutex mtx;
condition_variable pro;
condition_variable con;

struct Buffer {
	deque<int> que;
	int mark = 0;
};

//Buffer buf;
int index = 0;

void func_producer(Buffer *buf)
{
	for (index = 0; index < total; index++)
	{
		unique_lock<mutex> ulock(mtx);

		/*while (buf->mark >= bufsize)
			pro.wait(ulock);*/

		pro.wait(ulock, [&] {
			if (buf->mark < bufsize)
				return true;
			return false;
		});

		cout << "生产者生产第 " << index << " 个" << endl;
		buf->que.push_back(index);
		buf->mark++;
		ulock.unlock();
		con.notify_all();
	}
	cout << "生产者结束" << endl;
}

void func_consumer(Buffer *buf)
{
	while (true)
	{
		unique_lock<mutex> ulock(mtx);
		/*while (buf->mark <= 0)
			con.wait(ulock);*/

		con.wait(ulock, [&] {
			if (buf->mark > 0)
				return true;
			return false;
		});

		cout << "消费者取出元素 " << buf->que.front() << endl;
		buf->que.pop_front();
		buf->mark--;

		ulock.unlock();
		pro.notify_all();

		if (index == total && buf->mark == 0)
			break;
	}
	cout << "消费者结束" << endl;
}

int main()
{
	Buffer buf;
	thread process(func_producer, &buf);
	thread consume(func_consumer, &buf);
	process.join();
	consume.join();
	return 0;
}

同时在 VS 和 GCC 上分别编译运行,结果如下

VS下运行线程之间比较“整齐”,表面上是执行完生产者再执行消费者,但是这只是表面
在这里插入图片描述
GCC 下,运行时线程之间的通讯较为明显
在这里插入图片描述

最后附上CMakeList.txt

cmake_minimum_required(VERSION 2.6)
project(self)
SET(CMAKE_C_COMPILER g++)
set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++11 -pthread”)
add_executable(xx xx.cpp)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值