阻塞队列通过互斥锁和条件变量实现线程安全的共享数据,使用wait避免虚假唤醒,notify及时通知对方线程,确保生产者和消费者在队列满或空时正确阻塞与唤醒。

在多线程编程中,线程之间经常需要安全地共享数据。阻塞队列是一种常见的线程同步机制,当队列为空时,消费者线程会被阻塞,直到生产者放入新元素;当队列满时,生产者也会被阻塞,直到有空间可用。C++11 提供了 std::mutex 和 std::condition_variable 来实现这一功能。
基本原理
阻塞队列的核心是保护共享资源(如 std::queue)不被多个线程同时访问。通过互斥锁保证原子性,条件变量用于线程间通信:
- 使用 std::unique_lock<:mutex> 管理锁的生命周期
- 使用 std::condition_variable::wait() 让线程等待特定条件成立
- 使用 notify_one() 或 notify_all() 唤醒等待中的线程
实现一个简单的阻塞队列
下面是一个固定容量的阻塞队列模板实现:
#include <queue>
#include <mutex>
#include <condition_variable>
#include <chrono>
template <typename T>
class BlockingQueue {
private:
std::queue<T> data_queue_;
std::mutex mtx_;
std::condition_variable not_full_;
std::condition_variable not_empty_;
size_t capacity_;
public:
explicit BlockingQueue(size_t cap = 1000) : capacity_(cap) {}
void put(const T& item) {
std::unique_lock<std::mutex> lock(mtx_);
// 等待队列不满
not_full_.wait(lock, [this] { return data_queue_.size() < capacity_; });
data_queue_.push(item);
not_empty_.notify_one(); // 通知消费者
}
void take(T& item) {
std::unique_lock<std::mutex> lock(mtx_);
// 等待队列不空
not_empty_.wait(lock, [this] { return !data_queue_.empty(); });
item = data_queue_.front();
data_queue_.pop();
not_full_.notify_one(); // 通知生产者
}
bool empty() const {
std::lock_guard<std::mutex> lock(mtx_);
return data_queue_.empty();
}
size_t size() const {
std::lock_guard<std::mutex> lock(mtx_);
return data_queue_.size();
}
};
登录后复制
使用示例
启动一个生产者和一个消费者线程进行测试:
标签: c++ 阻塞队列 ai ios stream 同步机制
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~