c++ 线程安全队列 代码
时间: 2023-10-18 09:15:07 浏览: 115
C++实现线程安全队列
3星 · 编辑精心推荐
以下是一个简单的线程安全队列的代码实现:
```
#include <queue>
#include <mutex>
#include <condition_variable>
template<typename T>
class ThreadSafeQueue {
public:
ThreadSafeQueue() {}
void push(const T& value) {
std::lock_guard<std::mutex> lock(mutex_);
queue_.push(value);
condition_.notify_one();
}
bool try_pop(T& value) {
std::lock_guard<std::mutex> lock(mutex_);
if (queue_.empty()) {
return false;
}
value = queue_.front();
queue_.pop();
return true;
}
void wait_and_pop(T& value) {
std::unique_lock<std::mutex> lock(mutex_);
condition_.wait(lock, [this](){ return !queue_.empty(); });
value = queue_.front();
queue_.pop();
}
bool empty() const {
std::lock_guard<std::mutex> lock(mutex_);
return queue_.empty();
}
private:
mutable std::mutex mutex_;
std::queue<T> queue_;
std::condition_variable condition_;
};
```
这个类使用了一个 `std::queue` 作为内部存储,使用 `std::mutex` 和 `std::condition_variable` 来实现线程安全。其中,`push` 函数将元素加到队列末尾,并通过 `notify_one` 通知正在等待 `pop` 的线程;`try_pop` 函数尝试从队列头部取出元素,如果队列为空则返回 `false`;`wait_and_pop` 函数会等待队列非空,然后再取出队列头部的元素;`empty` 函数用来判断队列是否为空。
阅读全文