/*
题目
实现一个阻塞式的循环队列
要求:
- 多线程安全
- 队列满时调用写接口阻塞
- 队列空时调用读接口阻塞
*/
template <typename T>
class BlockingCircularBuffer {
public:
int mCap;
vector<T> mVec;
int mRead;
int mWrite;
mutex mL;
condition mCon;
explicit BlockingCircularBuffer(int size) {
mCap = size;
mRead = 0;
mWrite = 0;
}
void Push(const T &value) {
if (mVec.size() >= mCap) {
mL.lock();
mCon.wait(mL);
mVec[mWrite] = value;
mWrite++;
if (mWrite >= mCap) {
mWrite -= mCap;
}
mL.unlock();
}
else {
mL.lock();
mVec.push_back(value);
mWrite++;
if (mWrite >= mCap) {
mWrite -= mCap;
}
mL.unlock();
}
}
T Take() {
T res;
mL.lock();
T = mVec[mRead];
mRead++;
if (mRead >= mCap) {
mRead -= mCap;
}
mCon.singal();
mL.unlock();
return T;
}
bool Full() {
mL.lock();
bool res = mVec.size() == mCap ? 1 : 0;
mL.unlock();
return res;
}
bool Empty() {
mL.lock();
bool res = mVec.empty() ? 1 : 0;
mL.unlock();
return res;
}
};
C++实现阻塞式的循环队列
最新推荐文章于 2024-11-28 16:28:38 发布