C++的STL是线程不安全的,如果想要在多线程中使用的话需要加锁,
这里简单封装了如下四个接口
入队操作
阻塞式等待
非阻塞式等待
判断是否为空
代码如下所示:
#include <thread>
#include <mutex>
#include <condition_variable>
template<typename T>
class ThreadSafeQueue {
public:
~ThreadSafeQueue() = default;
void Push(T value) {
std::lock_guard<std::mutex> lock(mutexQueue);
dataQueue.push(value);
dataCond.notify_one();
}
void WaitAndPop(T &value) {
std::unique_lock<std::mutex> lock(mutexQueue);
dataCond.wait(lock, [this]{return !dataQueue.empty();});
value = std::move(dataQueue.front());
dataQueue.pop();
}
bool TryPop(T &value) {
std::lock_guard<std::mutex> lock(mutexQueue);
if (dataQueue.empty()) {
return false;
}
value = std::move(dataQueue.front());
dataQueue.pop();
return true;
}
void Empty() const {
std::lock_guard<std::mutex> lock(mutexQueue);
return dataQueue.empty();
}
private:
mutable std::mutex mutexQueue;
std::queue<T> dataQueue;
std::condition_variable dataCond;
};