C++11实现生产者消费者
2021/6/20 14:20:07
本文主要是介绍C++11实现生产者消费者,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
生产者消费者问题源码实现,使用c++11:
主要使用c++的锁和条件变量实现
/************************************ 生产者消费者,多线程实现问题 有一个存储的队列 生产者生产 消费者取消费 1:注意:结构体作为参数,&是引用传递 *是地址传递 2:互斥锁的实现和条件变量 ************************************/ #include <thread> #include <mutex> #include <condition_variable> #include <unistd.h> #include <iostream> using namespace std; //使用循环队列来进行存储消息 typedef struct buffer { int buff[10]; size_t read_position; size_t write_position; //采用互斥锁的方式实现生产和消费的异步取 mutex mtx; condition_variable not_full; //可写信号 condition_variable not_empty; //可读信号 buffer() { read_position = 0; write_position = 0; }; }ring_buffer; ring_buffer save_buffer; void produce_item(ring_buffer *buffer, int i) { //把i放入buffer中 要加锁 unique_lock<mutex> lock(buffer->mtx); //根据标志,来等待或者存 while((buffer->write_position+1)%10 == buffer->read_position) { cout<<"buffer is full now, producer is waiting \n"<<endl; (buffer->not_full).wait(lock);//等待释放锁的信号 } //生产者加入数据 (buffer->buff)[buffer->write_position] = i; buffer->write_position++; if(buffer->write_position == 10) buffer->write_position = 0; //给消费者发信号 (buffer->not_empty).notify_all(); lock.unlock(); } int consumer_item(ring_buffer *buffer) { //从buffer中取值返回 要加锁 int data; unique_lock<mutex> lock(buffer->mtx); while(buffer->read_position == buffer->write_position) { cout<<"buffer is empty, consumer is waiting"; (buffer->not_empty).wait(lock); } data = (buffer->buff)[buffer->read_position]; buffer->read_position ++; if(buffer->read_position >= 10) { buffer->read_position = 0; } (buffer->not_full).notify_all(); lock.unlock(); return data; } //负责生产消息,放入队列中//根据写标志位写在对应位上 void producer() { for(int i=0; i<100; i++) { produce_item(&save_buffer, i); } } void consumer() { static int cnt = 0; while(1) { sleep(1); int item = consumer_item(&save_buffer); cout<<"consumer item is:"<<item<<endl; if(++cnt == 100) { break; } } } int main() { thread produce(producer); thread consumes(consumer); produce.join(); consumes.join(); getchar(); return 0; }
这篇关于C++11实现生产者消费者的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享