SafeQueue类继承与信号量mutex(用于加锁),nonocopyable

定义如下:

template <typename T>
struct SafeQueue : private std::mutex, private noncopyable {
static const int wait_infinite = std::numeric_limits<int>::max(); SafeQueue(size_t capacity = ) : capacity_(capacity), exit_(false) {}
bool push(T&& v)
T pop_wait(int waitMs = wait_infinite);
bool pop_wait(T* v, int waitMs = wait_infinite); size_t size();
void exit();
bool exited() { return exit_; } private:
std::list<T> items_;
std::condition_variable ready_;
size_t capacity_;
std::atomic<bool> exit_;
void wait_ready(std::unique_lock<std::mutex>& lk, int waitMs);
};

该类可以安全的添加和删除任务,类内部使用容器list来存储具体的任务,具有退出状态:exit_,取出任务时可以设定超时时间。

其中Task的定义为:typedef std::function<void()> Task;  Task为返回值为空的函数对象

SafeQueue的具体实现如下:

template <typename T>
size_t SafeQueue<T>::size() {
std::lock_guard(std::mutex) lk(*this);
return items_.size();
} template <typename T>
void SafeQueue<T>::exit() {
exit_ = true;
std::lock_guard<std::mutex> lk(*this);
ready_.notify_all();
} template <typename T>
bool SafeQueue<T>::push(T&& v) {
std::lock_guard<std::mutex> lk(*this);
if (exit_ || (capacity_ && items_.size() >= capacity_)) {
return false;
} items_.push_back(std::move(v));
ready_.notify_one();
return true;
} template <typename T>
void SafeQueue<T>::wait_ready(std::unique_lock<std::mutex>& lk, int waitMs) {
if (exit_ || !items_.empty()) {
return;
}
if (waitMs == wait_infinite) {
ready_.wait(lk, [this] { return exit_ || !items_.empty(); });
} else if (waitMs > ) {
auto tp = std::chrono::steady_clock::now() + std::chrono::milliseconds(waitMs);
while (ready_.wait_until(lk, tp) != std::cv_status::timeout && items_.empty() && !exit_) {
}
}
} template <typename T>
bool SafeQueue<T>::pop_wait(T* v, int waitMs) {
std::unique_lock<std::mutex> lk(*this);
wait_ready(lk, waitMs);
if (items_.empty()) {
return false;
} *v = std::move(items_.front());
items_.pop_front();
return true;
} template <typename T>
T SafeQueue<T>::pop_wait(int waitMs) {
std::unique_lock<std::mutex> lk(*this);
wait_ready(lk, waitMs);
if (items_.empty()) {
return T();
}
T r = std::move(items_.front());
items_.pop_front();
return r;
}

handy源码阅读(三):SafeQueue类的更多相关文章

  1. 25 BasicUsageEnvironment0基本使用环境基类——Live555源码阅读(三)UsageEnvironment

    25 BasicUsageEnvironment0基本使用环境基类——Live555源码阅读(三)UsageEnvironment 25 BasicUsageEnvironment0基本使用环境基类— ...

  2. 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment

    24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类——Live555源码阅读 ...

  3. 26 BasicUsageEnvironment基本使用环境——Live555源码阅读(三)UsageEnvironment

    26 BasicUsageEnvironment基本使用环境--Live555源码阅读(三)UsageEnvironment 26 BasicUsageEnvironment基本使用环境--Live5 ...

  4. SparkSQL(源码阅读三)

    额,没忍住,想完全了解sparksql,毕竟一直在用嘛,想一次性搞清楚它,所以今天再多看点好了~ 曾几何时,有一个叫做shark的东西,它改了hive的源码...突然有一天,spark Sql突然出现 ...

  5. handy源码阅读(二):EventsImp类

    EventsImp用于完成事件的处理. class EventsImp { EventBase* base_; PollerBase* poller_; std::atomic<bool> ...

  6. handy源码阅读(六):tcp类

    首先是tcpconn和tcpserver类: struct TcpConn : public std::enable_shared_from_this<TcpConn>, private ...

  7. handy源码阅读(六):udp类

    分为UdpServer类和UdpConn类. struct UdpServer : public std::enable_shared_from_this<UdpServer>, priv ...

  8. handy源码阅读(四):Channel类

    通道,封装了可以进行epoll的一个fd. struct Channel: private noncopyable { Channel(EventBase* base, int fd, int eve ...

  9. handy源码阅读(一):EventBase类

    类EventBase继承于类EventBases,继承于noncopyable.  其中noncopyable是一个去除了拷贝构造和赋值构造的类. noncopyable: class noncopy ...

随机推荐

  1. CopyOnWriteArrayList 源码分析

    CopyOnWriteArrayList CopyOnWriteArrayList 能解决什么问题?什么时候使用 CopyOnWriteArrayList? 1)CopyOnWriteArrayLis ...

  2. docker搭建harbor私有镜像库

    创建harbor私有镜像库 一.部署准备: harbor软件包   在部署节点上: 1)解压harbor的软件包将harbor目录下所有文件发送到/opt/目录下   tar zxvf harbor- ...

  3. ClientDataSet初步使用

    https://blog.csdn.net/onebigday/article/details/5602619 ClientDataSet初步使用 2010年05月18日 08:36:00 阅读数:5 ...

  4. Altium Designer chapter8总结

    元件库操作中需要注意如下: (1)原理图库:主要分三部分来完成(绘制元件的符号轮廓.放置元件引脚.设计规则检查). (2)多子件原理图库:操作与原理图库基本相同,就是新建part. (3)PCB封装库 ...

  5. 【ABAP系列】SAP VA02修改销售订单的BAPI举例

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP VA02修改销售订单的B ...

  6. Mac入门--通过homebrew下载过慢问题

    使用国内的镜像替换homebrew镜像,对镜像进行加速源 原先我们执行brew命令安装的时候,跟3个仓库地址有关 1 brew.git 2 homebrew-core.git 3 homebrew-b ...

  7. oracle--角色权限

    将不同权限赋予角色,再将角色赋予用户,起到管理权限的作用 SQL> create role myrole; 角色已创建. SQL> grant create session to myro ...

  8. pytony格式化输出-占位符

    1. %s s = string 字符串 2. %d d = digit 整数 3. %f f = float 浮点数 #!/usr/bin/env python #_*_coding:utf-8_* ...

  9. Nginx环境下设置zblog伪静态方法

    Apache的环境非常简单.可以点击创建 .htaccess就可以了 Nginx环境下设置伪静态,并没有那个一键创建的按钮.只看到了这样的一个提示. 别的环境未测试.宝塔面板中 反正我是没找到. 宝塔 ...

  10. 1 Python 新建项目

    1 新建项目->新建Python文件 2导入package 库文件 3 import 类似using #include 4 写完代码编译 默认debug的对象是第一个创建的py文件,后续写的文件 ...