异步之生产者消费者模型--同步缓冲区的实现
2013-11-10 12:12
471 查看
适用于多个生产线程和多个消费线程之间的协作,生产者将信息放入同步缓冲区,消费者从该缓冲区中读取进行操作,可以指定特殊的“产品”来指示工作线程退出。
#ifndef __PRODUCER_CONSUMER_HPP_ #define __PRODUCER_CONSUMER_HPP_ #include <deque> class NonCopyable{ protected: NonCopyable(){} ~NonCopyable(){} private: NonCopyable(const NonCopyable&); const NonCopyable& operator=(const NonCopyable&); }; template<typename T> class SyncBuffer : public NonCopyable { public: typedef typename T SyncData; SyncBuffer(long max_size = 512) : max_size_(max_size){ InitializeCriticalSectionAndSpinCount(&cs_, 4000); empty_slot_event_ = CreateSemaphore(NULL, max_size_, max_size_, "empty_event"); full_slot_event_ = CreateSemaphore(NULL, 0, max_size_, "full_event"); } ~SyncBuffer(){ DeleteCriticalSection(&cs_); CloseHandle(empty_slot_event_); CloseHandle(full_slot_event_); } void push_front(const SyncData& data){ get_cs_for_add(); buffer_.push_back(data); get_cs_for_add(false); } void push_back(const SyncData& data){ get_cs_for_add(); buffer_.push_back(data); get_cs_for_add(false); } void pop_front(SyncData& data){ get_cs_for_remove(); data = buffer_.front(); buffer_.pop_front(); get_cs_for_remove(false); } void pop_back(SyncData& data){ get_cs_for_remove(); data = buffer_.back(); buffer_.pop_back(); get_cs_for_remove(false); } private: void get_cs_for_add(bool isget = true){ if(isget){ WaitForSingleObject(empty_slot_event_, INFINITE); EnterCriticalSection(&cs_); }else{ LeaveCriticalSection(&cs_); ReleaseSemaphore(full_slot_event_, 1, NULL); } } void get_cs_for_remove(bool isget = true){ if(isget){ WaitForSingleObject(full_slot_event_, INFINITE); EnterCriticalSection(&cs_); }else{ LeaveCriticalSection(&cs_); ReleaseSemaphore(empty_slot_event_, 1, NULL); } } std::deque<SyncData> buffer_; long max_size_; HANDLE empty_slot_event_; HANDLE full_slot_event_; CRITICAL_SECTION cs_; }; #endif // __PRODUCER_CONSUMER_HPP_
相关文章推荐
- 【Python之旅】第六篇(五):生产者消费者模型实现多线程异步交互
- 生产者消费者模型实现多线程异步交互
- 多线程中同步-异步---生产者与消费者-Queue---ThreadLocal实现局部变量保存
- Linux相互排斥与同步应用(三):posix线程实现单个生产者和单个消费者模型
- Linux互斥与同步应用(三):posix线程实现单个生产者和单个消费者模型
- python用于实现多线程异步交互之生产者消费者模型
- 生产者消费者 多线程 单个缓冲区 Win32API实现
- 生产者——消费者模型的java代码实现
- Java实现生产者与消费者模型
- 使用swoole的Process实现生产者消费者模型
- Java实现生产者消费者模型:多线程+BlockingQueue
- 线程同步:条件变量实现生产者消费者模型
- 4.利用python生成器实现简单的“生产者消费者”模型
- 简单生产者消费者模型(java实现)
- 多线程模拟实现生产者/消费者模型
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
- 简单实现生产者、消费者模型
- Java多线程之~~~~使用wait和notify实现生产者消费者模型
- Java线程同步:生产者-消费者 模型(代码示例)