Linux系统编程(20)——生产者-消费者模型基础示例(栈、队列实现、实现线程池)

生产者-消费者模型

多线程场景的的典型应用,应用场景非常广泛!手撕!!!

  • 消费者和消费者之间,是一个互斥关系。
  • 生产者和生产者之间,是一个互斥关系。
  • 生产者和消费者之间,是一个互斥同步关系。

注:同步互斥不一定非要用互斥锁和条件变量,还可以用信号量。


代码示例1:(栈实现,互斥锁/条件变量实现互斥同步)

#include <stdio.h>
#include<pthread.h> //头文件
#include <unistd.h>  //sleep头文件
#include <vector>

//定义一个互斥锁
pthread_mutex_t mutex;


//实现一个生产者消费者模型
//首先要有一个交易场所
std::vector<int> data;

//两个角色:生产者/消费者——两个线程
void* Product(void* arg) {
	(void*)arg;
	int count = 0;
	//负责把数据送到的交易场所中
	while (1)	{
		pthread_mutex_lock(&lock);
		data.push_back(++count);
		pthread_mutex_unlock(&lock);
		usleep(789789);
	}
	return NULL;
}

void* Consume(void* arg) {
	(void*)arg;
	//负责把交易场所中的数据获取出来
	while (1) {
		pthread_mutex_lock(&lock);
		//每次取最后一个元素
		//注意判空
		if (!data.empty()) {
			int result = data.back();
			data.pop_back();
			printf("result = %d\n", result);
		}
		pthread_mutex_unlock(&lock);
		usleep(123123);
	}
	return NULL;
}


int main() {

	pthread_mutex_init(&lock, NULL);//互斥锁初始化函数

	pthread_t tid1, tid2;
	pthread_create(&tid1, NULL, Product, NULL); //创建新线程
	pthread_create(&tid2, NULL, Consume, NULL);

	pthread_join(tid1,NULL); //线程等待
	pthread_join(tid2, NULL);


	pthread_mutex_destory(&lock);//互斥锁释放函数
	system("pause");
	return 0;
}

//不加互斥锁:
//但是使用过多线程,就有可能有段错误。
//因为C++STL中所提供的容器和算法都是线程不安全[重要]

//加上互斥锁:保证线程安全。<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值