c++多线程——基于锁和条件变量的前程安全队列
实现了一个模板类。
#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++多线程——基于锁和条件变量的前程安全队列相关推荐
- 【C++】多线程互斥锁、条件变量
我们了解互斥量和条件变量之前,我们先来看一下为什么要有互斥量和条件变量这两个东西,了解为什么有这两东西之后,理解起来后面的东西就简单很多了!!! 先来看下面这段简单的代码: int g_num = 0 ...
- Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)
本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...
- linux C语言多线程库pthread中条件变量的正确用法逐步详解
linux C语言多线程库pthread中条件变量的正确用法: 了解pthread常用多线程API和pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群. 关于条件变量的典型应用,可以参 ...
- 并发编程中的锁、条件变量和信号量
在并发编程中,经常会涉及到锁.条件变量和信号量.本文从并发开始,探究为什么需要它们,它们的概念,实现原理以及应用. 并发简介 并发是指多个事情,在同一时间段内同时发生了.和并发经常一起被提到的是并行. ...
- 信号量,互斥锁,条件变量的联系与区别
转自:http://blog.chinaunix.net/u3/108685/showart_2127853.html 信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程, ...
- 互斥锁、条件变量、自旋锁、读写锁
一.互斥锁 机制:一次只能一个线程拥有互斥锁,其他线程只有等待. 互斥锁是在抢锁失败的情况下主动放弃CPU,进入睡眠状态直到锁的状态改变时再唤醒,而操作系统负责线程调度,为了实现锁的状态发生改变时能唤 ...
- 非常精简的Linux线程池实现(一)——使用互斥锁和条件变量
https://blog.csdn.net/kxcfzyk/article/details/31719687 线程池的含义跟它的名字一样,就是一个由许多线程组成的池子. 有了线程池,在程序中使用多线程 ...
- Linux多线程开发-线程同步-条件变量pthread_cond_t
1.条件变量的概念 一个线程A的执行需要另一个线程B来唤醒,否则A挂起等待.线程B可以产生线程A继续执行的信号.条件变量常用在共享数据状态变化的场景中,例如:生产则和消费者问题.POSIX线程库提供了 ...
- linux线程间同步(1)互斥锁与条件变量
线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量以及读写锁. 互斥锁(mutex) 互斥锁,是一种信 ...
最新文章
- 2020牛客多校第一场B虚树+质数筛+换根dp
- jsp+mysql+servlet的登录
- hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地
- 2020.3.10.遗留问题
- java23种设计模式之五:代理模式
- 【HDU - 5649】DZY Loves Sorting(线段树,区间更新区间查询,思维,01缩数变换,线段树分割)
- 已知贝塞尔曲线上的点求控制点
- linux操作系统命令及流程图,计算机操作系统与简单命令
- 开发工具-Hijson
- C语言程序100例之C#版-008
- matlab打开dat形式文件_将matlab中数据保存为txt或dat格式
- 单片机延时问题20问
- rust闪退修复工具_Rust的错误处理
- 用python的turtle画等边三角形讲解_通过Python turtle绘制等边三角形谈编程思维和逻辑...
- FreeXGIS系列产品介绍
- RSA加密算法(32bit比特级运算)(复杂版)(C++实现)
- 3dmax2022 导不出datasmith格式文件
- Linux schedule 4、负载均衡
- css如何控制图片不变形?
- Java加密算法—非对称加密
热门文章
- 博途中用的是c吗_博图WINCC里如何添加c脚本
- 计算机:游戏14,英语专四作文满分范文(十四):电脑游戏
- 多年前写的一个ASP.NET网站管理系统,到现在有些公司在用
- c++编写手机小游戏代码_手机也能编程?盘点这6个可以用手机编程的App!快收藏!...
- 前端 JavaScript 条件语句优化
- 虚拟服务器配置推荐,如何选择虚拟主机配置
- HDU4026 Unlock the Cell Phone [状态压缩DP]
- mysql基础知识(一)
- php怎么实现弹幕,HTML如何利用canvas实现弹幕功能
- 在WinForm程序中读写系统配置