C++队列,怎么实现front没数据等待,pop时唤醒
时间: 2024-09-21 12:07:15 浏览: 27
在C++中,如果你想要实现在`front()`函数返回无数据时让线程等待,直到有新数据插入到队列头部,同时在`pop()`操作可以唤醒等待线程,这通常需要结合互斥量(mutex)、条件变量(condition_variable)以及智能指针等机制。这里提供一个简单的示例:
```cpp
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
class WaitingQueue {
private:
std::queue<int> data;
mutable std::mutex mtx;
std::condition_variable cv;
public:
void push(int value) {
std::lock_guard<std::mutex> lock(mtx);
data.push(value);
cv.notify_one(); // 唤醒等待的线程
}
int front() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return !data.empty(); }); // 线程等待直到有数据
if (data.empty()) {
throw std::runtime_error("No data available");
}
return data.front();
}
};
```
在这个例子中,`push()`操作在添加元素后立即通知等待的线程,而`front()`函数通过`cv.wait()`阻塞,直到有数据可用。注意,`wait()`内部的lambda表达式检查队列是否为空,如果为空则继续等待。
阅读全文