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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)