实现了一个模板类。

#pragma once
#include <exception>
#include <thread>
#include <mutex>
#include <queue>
#include <utility>
#include <condition_variable>
#include <memory>
using namespace std;
template<typename T>
class tsafe_queue {private:mutex m;queue<T> data;condition_variable c;
public:tsafe_queue() {}void push(T a_value) {lock_guard<mutex> lock(m);data.push(move(a_value));c.notify_one();}void wait_and_pop(T& value) {unique_lock<mutex> lk(m);c.wait(lk, [this] {return !data.empty(); });value = move(data.front());data.pop();}shared_ptr<T> wait_and_pop() {unique_lock<mutex> lk(m);c.wait(lk, [this] {return !data.empty(); });shared_ptr<T> res(make_shared<T>(move(data.front())));data.pop();return res;}bool try_pop(T& value) {lock_guard<mutex> lock(m);if (data.empty()) {return false;}value = move(data.front());data.pop();return true;}shared_ptr<T> try_pop() {lock_guard<mutex> lock(m);if (data.empty()) {return shared_ptr<T>();}shared_ptr<T> res(make_shared<T>(move(data.front())));data.pop();return res;}bool empty() const {lock_guard<mutex> lock(m);return data.empty();}
};

其中,wait_and_pop有两个重载,等待队列有数据才会返回,try_pop是立刻返回,没有数据时,返回false和空指针。
单线程测试

// 简单线程池.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include "tsafe_queue.h"int main()
{tsafe_queue<int> q;q.push(1);int i;q.try_pop(i);std::cout << i;
}

c++多线程——基于锁和条件变量的前程安全队列相关推荐

  1. 【C++】多线程互斥锁、条件变量

    我们了解互斥量和条件变量之前,我们先来看一下为什么要有互斥量和条件变量这两个东西,了解为什么有这两东西之后,理解起来后面的东西就简单很多了!!! 先来看下面这段简单的代码: int g_num = 0 ...

  2. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

  3. linux C语言多线程库pthread中条件变量的正确用法逐步详解

    linux C语言多线程库pthread中条件变量的正确用法: 了解pthread常用多线程API和pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群. 关于条件变量的典型应用,可以参 ...

  4. 并发编程中的锁、条件变量和信号量

    在并发编程中,经常会涉及到锁.条件变量和信号量.本文从并发开始,探究为什么需要它们,它们的概念,实现原理以及应用. 并发简介 并发是指多个事情,在同一时间段内同时发生了.和并发经常一起被提到的是并行. ...

  5. 信号量,互斥锁,条件变量的联系与区别

    转自:http://blog.chinaunix.net/u3/108685/showart_2127853.html 信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程, ...

  6. 互斥锁、条件变量、自旋锁、读写锁

    一.互斥锁 机制:一次只能一个线程拥有互斥锁,其他线程只有等待. 互斥锁是在抢锁失败的情况下主动放弃CPU,进入睡眠状态直到锁的状态改变时再唤醒,而操作系统负责线程调度,为了实现锁的状态发生改变时能唤 ...

  7. 非常精简的Linux线程池实现(一)——使用互斥锁和条件变量

    https://blog.csdn.net/kxcfzyk/article/details/31719687 线程池的含义跟它的名字一样,就是一个由许多线程组成的池子. 有了线程池,在程序中使用多线程 ...

  8. Linux多线程开发-线程同步-条件变量pthread_cond_t

    1.条件变量的概念 一个线程A的执行需要另一个线程B来唤醒,否则A挂起等待.线程B可以产生线程A继续执行的信号.条件变量常用在共享数据状态变化的场景中,例如:生产则和消费者问题.POSIX线程库提供了 ...

  9. linux线程间同步(1)互斥锁与条件变量

    线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量以及读写锁. 互斥锁(mutex) 互斥锁,是一种信 ...

最新文章

  1. 融合变形三维插件想法
  2. wxWidgets:wxVariantDataCurrency类用法
  3. java就是我的幸福,嫁给幸福
  4. javascript:jquery.history.js使用方法
  5. sonar api 获取质量数据
  6. 如何编写更好的POJO服务
  7. 深入理解L1、L2正则化
  8. Ubuntu 20.10安装docker
  9. Python中string、json、bytes的相互转换
  10. android文本框自动补全,[Android]AutoCompleteTextView自动补全文本框
  11. 使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算
  12. Steve Kemp的XSS介绍
  13. Python 前端之HTML
  14. 高校后勤管理系统java代码_java毕业设计_springboot框架的高校后勤信息管理系统...
  15. matlab双峰滤波,MATLAB中的单峰或双峰分布
  16. 特殊字符--百度百科
  17. windows 7系统中单独添加北京时区办法
  18. Matlab开发Web App服务器
  19. 搜遍全网,终于找到一个适合新手入门的物联网教程
  20. android 扫码枪编程,android 扫码枪解惑

热门文章

  1. mysql之事务_MySQL之事务
  2. mysql 备份库的shell_linux备份Mysql数据库shell_MySQL
  3. SQL那些事儿(九)--oracle数据库知识体系
  4. Nginx编译-安装-配置-优化实践总结
  5. 用友nc操作手册_铁军人物汤轩宇, 入职两年,她用努力和汗水编制出单户试算操作手册...
  6. asp.net mvc 压缩html代码,浅谈ASP.NET中MVC 4 的JS/CSS打包压缩功能
  7. 六、Mysql体系架构、存储引擎、临时表
  8. MySQL中Join算法实现原理通俗易懂
  9. Linux系统下修改主机名(CentOS7)
  10. core api其他电脑不能访问接口_第 12 篇:加缓存为接口提速