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

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

 

posted @ 2023-06-17 10:46  yangzixiongh  阅读(359)  评论(0编辑  收藏  举报