基于std::queue c++11 线程安全队列
时间: 2023-08-09 20:01:31 浏览: 60
std::queue是C++标准库中的队列容器,它不是线程安全的。在多线程环境下使用std::queue可能会导致数据竞争和问题。
为了保证线程安全,可以对std::queue进行适当的封装或使用其他已经实现好的线程安全队列。C++11中引入了std::queue的线程安全版本std::queue。
std::queue的线程安全版本可以通过使用互斥锁(mutex)来保护队列的访问。互斥锁可以确保同一时间只有一个线程访问队列,避免了数据竞争。
以下是一个基于std::queue的线程安全队列的示例:
```cpp
#include <queue>
#include <mutex>
template <typename T>
class ThreadSafeQueue
{
public:
ThreadSafeQueue() {}
void push(const T& value)
{
std::lock_guard<std::mutex> lock(mutex_);
queue_.push(value);
}
bool pop(T& value)
{
std::lock_guard<std::mutex> lock(mutex_);
if (queue_.empty())
return false;
value = queue_.front();
queue_.pop();
return true;
}
bool empty() const
{
std::lock_guard<std::mutex> lock(mutex_);
return queue_.empty();
}
size_t size() const
{
std::lock_guard<std::mutex> lock(mutex_);
return queue_.size();
}
private:
std::queue<T> queue_;
mutable std::mutex mutex_;
};
```
上述代码中,通过std::mutex实现了对队列的互斥访问,使得push、pop、empty和size等操作变得线程安全。
基于std::queue的线程安全队列可以在多线程环境下安全地进行数据操作,避免了数据竞争的问题,提高了程序的稳定性和可靠性。