实现了一个模板类。

#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. 2020牛客多校第一场B虚树+质数筛+换根dp
  2. jsp+mysql+servlet的登录
  3. hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地
  4. 2020.3.10.遗留问题
  5. java23种设计模式之五:代理模式
  6. 【HDU - 5649】DZY Loves Sorting(线段树,区间更新区间查询,思维,01缩数变换,线段树分割)
  7. 已知贝塞尔曲线上的点求控制点
  8. linux操作系统命令及流程图,计算机操作系统与简单命令
  9. 开发工具-Hijson
  10. C语言程序100例之C#版-008
  11. matlab打开dat形式文件_将matlab中数据保存为txt或dat格式
  12. 单片机延时问题20问
  13. rust闪退修复工具_Rust的错误处理
  14. 用python的turtle画等边三角形讲解_通过Python turtle绘制等边三角形谈编程思维和逻辑...
  15. FreeXGIS系列产品介绍
  16. RSA加密算法(32bit比特级运算)(复杂版)(C++实现)
  17. 3dmax2022 导不出datasmith格式文件
  18. Linux schedule 4、负载均衡
  19. css如何控制图片不变形?
  20. Java加密算法—非对称加密

热门文章

  1. 博途中用的是c吗_博图WINCC里如何添加c脚本
  2. 计算机:游戏14,英语专四作文满分范文(十四):电脑游戏
  3. 多年前写的一个ASP.NET网站管理系统,到现在有些公司在用
  4. c++编写手机小游戏代码_手机也能编程?盘点这6个可以用手机编程的App!快收藏!...
  5. 前端 JavaScript 条件语句优化
  6. 虚拟服务器配置推荐,如何选择虚拟主机配置
  7. HDU4026 Unlock the Cell Phone [状态压缩DP]
  8. mysql基础知识(一)
  9. php怎么实现弹幕,HTML如何利用canvas实现弹幕功能
  10. 在WinForm程序中读写系统配置