zoukankan      html  css  js  c++  java
  • 使用条件变量的线程安全队列

    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();
     }
    };
    

      

  • 相关阅读:
    服务器被黑

    ZXW说
    抽象类
    URL参数加密解密过程
    SqlServer 跨服务器 DML
    发布
    C#操作XML小结
    定时指执程序
    SQL语句判断数据库、表、字段是否存在
  • 原文地址:https://www.cnblogs.com/zhanghu52030/p/10481169.html
Copyright © 2011-2022 走看看