关闭

【并发编程实战笔记】--使用锁和条件变量的线程安全队列

标签: queue并发C++
345人阅读 评论(0) 收藏 举报
分类:

线程安全队列实现代码

queue.hpp

template<typename T>
class threadsafe_queue
{
private:
    mutable std::mutex mut;
    std::queue<T> data_queue;
    std::condition_variable data_cond;
public:
    threadsafe_queue()
    {}

    void push(T new_value)
    {
        std::lock_guard<std::mutex> lk(mut);
        data_queue.push(std::move(new_value));
        data_cond.notify_one();
    }

    void wait_and_pop(T& value)
    {
        std::unique_lock<std::mutex> lk(mut);
        data_cond.wait(lk,[this]{return !data_queue.empty();});
        value=std::move(data_queue.front());
        data_queue.pop();
    }

    std::shared_ptr<T> wait_and_pop()
    {
        std::unique_lock<std::mutex> lk(mut);
        data_cond.wait(lk,[this]{return !data_queue.empty();});
        std::shared_ptr<T> res(
            std::make_shared<T>(std::move(data_queue.front())));
        data_queue.pop();
        return res;
    }

    bool try_pop(T& value)
    {
        std::lock_guard<std::mutex> lk(mut);
        if(data_queue.empty())
            return false;
        value=std::move(data_queue.front());
        data_queue.pop();
    }

    std::shared_ptr<T> try_pop()
    {
        std::lock_guard<std::mutex> lk(mut);
        if(data_queue.empty())
            return std::shared_ptr<T>();
        std::shared_ptr<T> res(
            std::make_shared<T>(std::move(data_queue.front())));
        data_queue.pop();
        return res;
    }

    bool empty() const
    {
        std::lock_guard<std::mutex> lk(mut);
        return data_queue.empty();
    }
};

测试代码

int main()
{
    threadsafe_queue<int> si;
    si.push(5);
    //si.wait_and_pop();
    if(!si.empty())
    {
        cout << "pop is operator" << endl;
    //  int x;
    //  si.try_pop(x);
    //  cout << "x : " << x << endl;
        auto a = si.try_pop();
        cout << "a : " << *a << endl;
    }
    return 0;
}

使用wait_and_pop()与try_pop()函数的区别是在于,当队列为空时,wait_and_pop()会引发安全异常,而try_pop()函数不会。

源码地址:
https://github.com/ykevin/blog/tree/master/concurrency/queue

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

多线程用互斥锁和条件变量实现生产者和消费者-------循环任务队列

互斥锁与条件变量简介 在多线程的环境中,全局变量会被各线程共享,因此在操作全局变量的时候需要采用锁机制,在linux里最常用的锁就是互斥锁,互斥锁使用方法如下 //线程A pthread_mutex_...
  • u010424605
  • u010424605
  • 2015-01-19 13:59
  • 1167

多线程无锁算法之无锁队列的实现

多线程无锁算法之无锁队列的实现 今天花了近两个小时的时间好好的理解了一下多线程无锁队列的实现,查看了很多资料和文献。在我看来,实现无锁队列的关键点有二: 1、各个平台的原子操作或者说CAS原语; ...
  • ljh081231
  • ljh081231
  • 2014-02-17 17:04
  • 11757

c++11 线程安全的队列实现

用c++11的mutex和condition_variable配合STL的queue可以很方便地实现线程安全的队列,queue用来存取元素,存取元素时用mutex进行全局加锁,存取完成再进行解锁。 ...
  • mymodian
  • mymodian
  • 2016-12-13 11:53
  • 2197

c++ 11 多线线程系列--------使用锁和条件变量的线程安全队列

哎哟,自己仔细体会咯,想要拿去用随便好了!!! #include #include #include #include #include #include #include #incl...
  • chenxun2009
  • chenxun2009
  • 2015-11-24 22:15
  • 1059

Linux多线程系列-2-条件变量的使用(线程安全队列的实现)

多线程情况下,往往需要使用互斥变量来实现线程间的同步,实现资源正确共享。 linux下使用如下变量和函数 //条件变量 pthread_cond_t int pthread_cond_init (pt...
  • whuqin
  • whuqin
  • 2013-07-09 14:49
  • 2040

[C++11 并发编程] 12 使用条件变量创建线程间安全的队列

之前有一节中,我们使用mutex实现了一个线程间安全的堆栈。这一节,我们使用条件变量来实现一个线程间安全的队列。 标准库中的std::queue template > class queue { p...
  • yamingwu
  • yamingwu
  • 2015-08-26 21:28
  • 638

利用条件变量实现线程安全队列

原文: Implementing a Thread-Safe Queue using Condition Variables  利用条件变量实现线程安全队列 One problem that...
  • ykxggg
  • ykxggg
  • 2014-02-15 11:00
  • 888

Linux下多线程编程互斥锁和条件变量的简单使用

Linux下多线程编程互斥锁和条件变量的简单使用!
  • fengbingchun
  • fengbingchun
  • 2015-09-19 20:49
  • 2580

只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:1对变量的写操作不依赖于当前值。 2该变量没有包含在具有其他

Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低)...
  • hzw05103020
  • hzw05103020
  • 2015-07-25 09:05
  • 351

《Java并发编程实战》读书笔记二:构建线程安全

一、用组合来实现线性安全1.设计线程安全的类设计线程安全类的三个基本要素: 1. 找出构成对象状态的所有变量 2. 找出约束状态变量的不变性条件 3. 建立对象状态的并发访问管理策略要分析对象的...
  • jeffleo
  • jeffleo
  • 2016-12-24 20:54
  • 421
    个人资料
    • 访问:10154次
    • 积分:185
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    最新评论