C++11 消费者线程与生产者线程demo

C++11 消费者线程与生产者线程demo

#include <stdio.h>
#include <thread>
#include <memory>
#include <list>
#include <mutex>
#include <condition_variable>


#define _dbg(fmt,...) do {printf("[Dbg][%s:%d] " fmt "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__);} while(0)

class AA {
public:
    AA() {
        mData = sCount ++;
        _dbg("data %u", mData);
    }
    ~AA() {
        _dbg("data %u", mData);
    }
    unsigned data() const { return mData; }
private:
    unsigned mData;
    static unsigned sCount;
};
unsigned AA::sCount = 0;

struct proc_context {
    bool mRunFlag;
    std::list< std::shared_ptr<AA> > mQueue;
    std::mutex mMutex;
    std::condition_variable mCond;
};

static void proc_producer(struct proc_context& ctx)
{
    _dbg("enter");
    for (;ctx.mRunFlag;) {
        {
            std::unique_lock<std::mutex> lck(ctx.mMutex);
            std::shared_ptr<AA> a = std::make_shared<AA>();
            _dbg("push data %u", a->data());
            ctx.mQueue.push_back(a);
            ctx.mCond.notify_one();
        }
        std::this_thread::sleep_for(std::chrono::microseconds(100000));
    }
    _dbg("leave");
}


static void proc_consumer(struct proc_context& ctx)
{
    _dbg("enter");
    for (;ctx.mRunFlag;) {
        std::unique_lock<std::mutex> lck(ctx.mMutex);
        ctx.mCond.wait_for(lck, std::chrono::microseconds(500000), [&]()->bool {
                    return !ctx.mQueue.empty();
                });
        if (!ctx.mQueue.empty()) {
            std::shared_ptr<AA> a = ctx.mQueue.front();
            ctx.mQueue.pop_front();
            _dbg("pop  data %u", a->data());
        }
    }
    _dbg("leave");
}

int main()
{
    _dbg("enter");
    struct proc_context ctx;
    ctx.mRunFlag = true;
    std::thread t0 = std::thread(proc_producer, std::ref(ctx));
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::thread t1 = std::thread(proc_consumer, std::ref(ctx));
    std::this_thread::sleep_for(std::chrono::seconds(10));
    ctx.mRunFlag = false;
    t0.join();
    t1.join();
    _dbg("leave");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值