Windows下一个并发阻塞队列(BlockingQueue)
Windows下一个带有大小限制的并发阻塞队列,实现的比较简单。
#ifndef BLOCKINGQUEUE_H_ #define BLOCKINGQUEUE_H_ #include <queue> #include <windows.h> using namespace std; template <typename T> class BoundedBlockingQueue { public: BoundedBlockingQueue(int size) : maxSize(size) { _lock = CreateMutex(NULL,false,NULL); _rsem = CreateSemaphore(NULL,0,size,NULL); _wsem = CreateSemaphore(NULL,size,size,NULL); } ~BoundedBlockingQueue() { CloseHandle(_lock); CloseHandle(_rsem); CloseHandle(_wsem); } void push(const T& data); T pop(); bool empty() { WaitForSingleObject(_lock,INFINITE); bool is_empty = _array.empty(); ReleaseMutex(_lock); return is_empty; } private: deque<T> _array; int maxSize; HANDLE _lock; HANDLE _rsem, _wsem; }; template <typename T> void BoundedBlockingQueue <T>::push(const T& value ) { WaitForSingleObject(_wsem,INFINITE); WaitForSingleObject(_lock,INFINITE); _array.push_back(value); ReleaseMutex(_lock); ReleaseSemaphore(_rsem,1,NULL); } template <typename T> T BoundedBlockingQueue<T>::pop() { WaitForSingleObject(_rsem,INFINITE); WaitForSingleObject(_lock,INFINITE); T _temp = _array.front(); _array.pop_front(); ReleaseMutex(_lock); ReleaseSemaphore(_wsem,1,NULL); return _temp; } #endif
主函数调用测试:一个生产者、两个消费者使用这个队列进行测试。
#include "BlockingQueue.h" #include <windows.h> #include <iostream> using namespace std; bool is_over = false; DWORD WINAPI produce(LPVOID lppara) { BoundedBlockingQueue<int> *queue = (BoundedBlockingQueue<int> *)lppara; while(1) { for(int i=1; i<=50; ++i) { queue->push(i); cout<<GetCurrentThreadId()<<" put a data: "<<i<<endl; Sleep(10); //producer is fast } is_over = true; break; } return NULL; } DWORD WINAPI consume(LPVOID lppara) { BoundedBlockingQueue<int> *queue = (BoundedBlockingQueue<int> *)lppara; while(1) { int d = queue->pop(); cout<<GetCurrentThreadId()<<" get data: "<<d<<endl; //double check if(is_over && queue->empty()) { cout<<"OVER!"<<endl; break; } Sleep(10); //consumer is slow } return NULL; } int main() { DWORD write_data; DWORD read_data; DWORD read_data1; BoundedBlockingQueue<int> queue(20); //一个生产者、两个消费者 if(CreateThread(NULL,0,produce,&queue,0,&write_data)==NULL) return -1; if(CreateThread(NULL,0,consume,&queue,0,&read_data)==NULL) return -1; if(CreateThread(NULL,0,consume,&queue,0,&read_data1)==NULL) return -1; char ch; while(1) { ch = getchar(); //press "e" to exit if(ch == 'e') break; } printf("Program ends successfully\n"); return 0; }
作者:阿凡卢
出处:https://www.cnblogs.com/luxiaoxun/archive/2012/10/11/2719699.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端