• 使用条件变量的线程安全队列


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

      

  • 相关阅读:
    委托的BeginInvoke和EndInvoke
    HTTP Post
    显示一个托盘
    sql语句
    在C++ 中 如何调用 C# 写的DLL(转载)
    WinForm-MenuStrip
    rsync定时同步和rsync+sersync实时同步
    innobackupex自动备份数据库脚本
    innobackupex备份恢复mysql
    gitlab安装和基本使用
  • 原文地址:https://www.cnblogs.com/zhanghu52030/p/10481169.html
Copyright © 2020-2023  润新知