C++ 实现SyncQueue
时间: 2023-07-11 10:08:46 浏览: 172
SyncQueue是一种线程安全的队列,它可以在多线程环境下,实现线程间的同步操作。下面是一个基于C++11实现SyncQueue的示例代码:
```c++
#include <mutex>
#include <condition_variable>
#include <queue>
template<typename T>
class SyncQueue {
public:
SyncQueue(int maxSize) : maxSize_(maxSize) {}
void Put(const T& x) {
std::unique_lock<std::mutex> locker(mutex_);
notFull_.wait(locker, [this] { return queue_.size() < maxSize_; });
queue_.push(x);
notEmpty_.notify_one();
}
void Take(T& x) {
std::unique_lock<std::mutex> locker(mutex_);
notEmpty_.wait(locker, [this] { return !queue_.empty(); });
x = queue_.front();
queue_.pop();
notFull_.notify_one();
}
bool Empty() const {
std::lock_guard<std::mutex> locker(mutex_);
return queue_.empty();
}
bool Full() const {
std::lock_guard<std::mutex> locker(mutex_);
return queue_.size() == maxSize_;
}
size_t Size() const {
std::lock_guard<std::mutex> locker(mutex_);
return queue_.size();
}
int Count() const {
return queue_.size();
}
private:
mutable std::mutex mutex_;
std::condition_variable notEmpty_;
std::condition_variable notFull_;
std::queue<T> queue_;
int maxSize_;
};
```
这个SyncQueue使用了一个std::queue来存储数据,并通过std::mutex和std::condition_variable来实现线程同步,确保在多线程环境下操作的安全性。使用方式如下:
```c++
SyncQueue<int> q(10); // 创建一个最大容量为10的SyncQueue
q.Put(1); // 向队列中添加数据1
int x;
q.Take(x); // 从队列中取出数据,存放在x中
bool empty = q.Empty(); // 判断队列是否为空
bool full = q.Full(); // 判断队列是否已满
size_t size = q.Size(); // 获取队列中元素的个数
int count = q.Count(); // 获取队列中元素的个数
```
需要注意的是,当队列为空时,调用Take()函数会被阻塞,直到队列中有数据;当队列已满时,调用Put()函数会被阻塞,直到队列有空闲位置。
阅读全文