生产者-消费者模型
多线程场景的的典型应用,应用场景非常广泛!手撕!!!
- 消费者和消费者之间,是一个互斥关系。
- 生产者和生产者之间,是一个互斥关系。
- 生产者和消费者之间,是一个互斥同步关系。
注:同步互斥不一定非要用互斥锁和条件变量,还可以用信号量。
代码示例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中所提供的容器和算法都是线程不安全[重要] //加上互斥锁:保证线程安全。<
Linux系统编程(20)——生产者-消费者模型基础示例(栈、队列实现、实现线程池)
最新推荐文章于 2023-12-07 16:44:02 发布