首页 > 编程语言 > c++线程安全队列--有锁

c++线程安全队列--有锁

时间:2023-06-17 11:02:30浏览次数:41  
标签:std return 队列 lock c++ 线程 有锁 data

C++线程安全队列是一种数据结构,用于在多线程环境中安全地共享数据。它提供了一组功能,确保多个线程可以同时读取和写入队列,而不会导致竞争条件或数据损坏。C++线程安全队列的常见功能:

  1. 入队操作(Enqueue):将一个元素添加到队列的尾部。这个操作必须是原子的,以确保在多线程环境中不会发生数据损坏。

  2. 出队操作(Dequeue):从队列的头部移除一个元素并返回它。与入队操作一样,出队操作也必须是原子的。

  3. 判空操作(IsEmpty):检查队列是否为空。这个操作通常用于判断是否继续从队列中取出元素。

  4. 获取队列大小(Size):返回队列中当前元素的数量。这个操作可以帮助你了解队列的状态。

  5. 清空队列(Clear):移除队列中的所有元素,使其为空。

  6. 支持多线程并发访问:线程安全队列必须能够同时处理来自多个线程的入队和出队操作,而不会导致数据损坏或不一致的状态。

  7. 同步机制:线程安全队列通常使用同步机制(如互斥锁、条件变量等)来实现对队列访问的互斥控制和线程间的同步。

点击查看代码
#ifndef THREAD_QUEUE_H_
#define THREAD_QUEUE_H_

#include <deque>
#include <mutex>
#include <condition_variable>
#include <chrono>

template<typename T>
class ThreadSafeQueue
{
public:
	template <typename Element>
	void push(Element&& element)
	{
		std::lock_guard<std::mutex> lg(mtx);
		data.push_back(std::forward<Element>(element));
		cv.notify_one();
	}

	bool try_pop(T& element)
	{
		std::lock_guard<std::mutex> lg(mtx);
		if(data.empty())
		{
			return false;
		}
		element = std::move(data.front());
		data.pop_front();
		return true;
	}

	void wait_pop(T& t)
	{
		std::unique_lock<std::mutex> lock(mtx);
		cv.wait(lock, [this]() { return !data.empty(); });
		t = std::move(data.front());
		data.pop_front();
	}

	bool timeout_pop(T& t, size_t time_out_ms = 10)
	{
		std::unique_lock<std::mutex> lock(mtx);
		bool has_value = cv.wait_for(lock, std::chrono::milliseconds(time_out_ms), [this]() { return !data.empty(); });
		if(!has_value)
		{
			return false;
		}
		t = std::move(data.front());
		data.pop_front();
		return true;
	}

	bool empty()
	{
		std::lock_guard<std::mutex> lg(mtx);
		return data.empty();
	}

	size_t size()
	{
		std::lock_guard<std::mutex> lg(mtx);
		return data.size();
	}



private:
	std::mutex mtx;
	std::condition_variable cv;
	std::deque<T> data;
};



#endif

标签:std,return,队列,lock,c++,线程,有锁,data
From: https://www.cnblogs.com/yangzixiong/p/17487149.html

相关文章

  • UE/C++简单功能实现笔记
    本篇笔记主要用于记录如何利用C++在虚幻引擎5中实现一些基本的功能需求。目录实现功能与代码构造函数中添加物体运行时添加C++Actor运行时设置动态材质及参数蓝图调用C++函数蓝图访问C++成员C++调用用户控件蓝图函数播放wav格式音效实现功能与代码以下代码均来自我的跳棋小游......
  • C++面试八股文:什么是左值,什么是右值?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第16面:面试官:什么是左值,什么是右值?二师兄:简单来说,左值就是可以使用&符号取地址的值,而右值一般不可以使用&符号取地址。inta=42; //a是左值,可以&aint*p=&a;int*p=&42; //42是右值,无法取地址二师兄:一般左值存在内存......
  • c++实现二叉树中序遍历
    #include<iostream>usingnamespacestd;//定义二叉树节点结构体structTreeNode{  intval;  TreeNode*left;  TreeNode*right;  TreeNode(intx):val(x),left(NULL),right(NULL){}};//中序遍历函数voidinorderTraversal(TreeNode*root){......
  • 《C++》友元
    友元--friend友元可以访问类的私有属性classPerson{ friendvoidtest();public: Person(intn) { this->n=n; }private: intn;};voidtest(){ Personp(20); cout<<p.n<<endl;}intmain(){ test(); system("pause"); return0;}友......
  • 【初识C++】(缺省参数和函数重载)
    @TOC一、缺省参数1.缺省参数定义缺省参数是在函数的声明中给定参数一个指定的值。如果传参没有给定参数,那就按照声明中默认的缺省值,如果给定了参数,那就按照给定的参数值。比如:usingnamespacestd;voidFunc(inta=0){ cout<<a<<endl;}intmain(){ Func(); //......
  • c++强制类型转换的不同
    参考https://blog.csdn.net/luolaihua2018/article/details/111996610https://zhuanlan.zhihu.com/p/368267441https://zhuanlan.zhihu.com/p/151744661https://blog.csdn.net/Behold1942/article/details/111657231https://stackoverflow.com/questions/332030/when-sho......
  • c++ linux 学习第二课
    c++linux学习第二课一、GCC的工作流程:gcc编译器将C源文件到生成一个可执行程序中间一共经历四个步骤:二、gcc常用参数:-v版本-E生成预处理文件-S生成汇编文件-c只编译,生成目标文件.o文件-I(大写的i)指定头文件所在的路径-L指定库文件所在的路径-l(小写的L)......
  • C++面试八股文:在C++中,你知道哪些运算符?
    C++面试八股文:在C++中,你知道哪些运算符?某日二师兄参加XXX科技公司的C++工程师开发岗位第11面:面试官:在C++中,你都知道都哪些运算符?二师兄:啥?运算符?+-*/=这些算吗?面试官:嗯,还有其他的吗?二师兄:当然还有,+=,-=,*=,/=,==,还有逻辑运算,位运算等。面试官:好的。那你知道这些运算......
  • C++通讯录管理系统[2023-06-16]
    C++通讯录管理系统[2023-06-16]通讯录管理系统手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(假设每个位置上的存储容量为1000,即手机卡中或手机上最多只能存储1000个联系人)。存储在手机中的联系人的信息只包含姓名和电话号码两项......
  • JAVA 线程安全案例
    #线程安全案例##使用原子类来实现资源的安全保护```javapublicclassAtomicSafeExample{staticCountDownLatchcountDownLatch=newCountDownLatch(2);publicstaticvoidmain(String[]args)throwsInterruptedException{Threadthread=newThrea......