关闭

C++线程安全队列

1165人阅读 评论(0) 收藏 举报
分类:
template<typename Data>
class concurrent_queue
{
private:
    std::queue<Data> the_queue;
    mutable boost::mutex the_mutex;
    boost::condition_variable the_condition_variable;

public:
    void push(Data const& data)
    {
#if 0
        boost::mutex::scoped_lock lock(the_mutex);
        the_queue.push(data);
        lock.unlock();
#else   //利用作用域自动释放锁,防止异常崩溃场景
        {
            boost::mutex::scoped_lock lock(the_mutex);
            the_queue.push(data);
        }
#endif
        the_condition_variable.notify_one();
    }

    bool empty() const
    {
        boost::mutex::scoped_lock lock(the_mutex);
        return the_queue.empty();
    }

    //获取队列头部的值,并移除队列头部
    bool try_pop(Data& popped_value)
    {
        boost::mutex::scoped_lock lock(the_mutex);
        if(the_queue.empty())
        {
            return false;
        }

        popped_value=the_queue.front();
        the_queue.pop();
        return true;
    }

    //等待队列有值,再弹出队列的头部
    void wait_and_pop(Data& popped_value)
    {
        boost::mutex::scoped_lock lock(the_mutex);
        while(the_queue.empty())
        {
            the_condition_variable.wait(lock);
        }

        popped_value=the_queue.front();
        the_queue.pop();
    }

};

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:113588次
    • 积分:1964
    • 等级:
    • 排名:千里之外
    • 原创:85篇
    • 转载:21篇
    • 译文:0篇
    • 评论:10条
    最新评论