C++线程安全队列是一种数据结构,用于在多线程环境中安全地共享数据。它提供了一组功能,确保多个线程可以同时读取和写入队列,而不会导致竞争条件或数据损坏。C++线程安全队列的常见功能:
-
入队操作(Enqueue):将一个元素添加到队列的尾部。这个操作必须是原子的,以确保在多线程环境中不会发生数据损坏。
-
出队操作(Dequeue):从队列的头部移除一个元素并返回它。与入队操作一样,出队操作也必须是原子的。
-
判空操作(IsEmpty):检查队列是否为空。这个操作通常用于判断是否继续从队列中取出元素。
-
获取队列大小(Size):返回队列中当前元素的数量。这个操作可以帮助你了解队列的状态。
-
清空队列(Clear):移除队列中的所有元素,使其为空。
-
支持多线程并发访问:线程安全队列必须能够同时处理来自多个线程的入队和出队操作,而不会导致数据损坏或不一致的状态。
-
同步机制:线程安全队列通常使用同步机制(如互斥锁、条件变量等)来实现对队列访问的互斥控制和线程间的同步。
点击查看代码
#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