异步之生产者消费者模型--同步缓冲区的实现

本文详细介绍了生产者-消费者模型在多线程环境下的应用,通过使用同步缓冲区实现了生产者将信息放入缓冲区,消费者从中读取进行操作的功能。模型支持指定特殊'产品'来指示工作线程退出,并通过关键代码段展示了如何使用互斥锁、信号量等技术确保线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适用于多个生产线程和多个消费线程之间的协作,生产者将信息放入同步缓冲区,消费者从该缓冲区中读取进行操作,可以指定特殊的“产品”来指示工作线程退出。

#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_


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值