使用c++17实现一个缓存队列,并通过写线程将获取的字符串放到该缓存,读线程每25ms读取一次同时取走1000个字符,如果不够则将有的所有数据取出
时间: 2024-12-11 12:43:19 浏览: 5
在C++17中,我们可以使用`std::queue`作为缓存队列,结合`std::thread`来实现实时填充和读取功能。这里我们假设有一个`std::string`的生产者线程不断生成字符串并添加到队列,而消费者线程定期从队列中读取指定数量的字符。由于并发操作,我们将使用互斥锁(`std::mutex`)来同步对队列的访问。
```cpp
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <chrono>
class CacheQueue {
public:
void push(const std::string &data) {
std::lock_guard<std::mutex> lock(queue_mutex);
cache.push(data);
}
std::string read(int count) {
std::lock_guard<std::mutex> lock(queue_mutex);
if (cache.empty()) {
// 如果队列为空,直接返回所有数据
return std::string(cache.begin(), cache.end());
}
// 否则只取前count个字符
std::string result;
result.reserve(count);
while (!cache.empty() && result.size() < count) {
result += cache.front();
cache.pop();
}
return result;
}
private:
std::queue<std::string> cache;
mutable std::mutex queue_mutex; // 互斥锁
};
void producer(CacheQueue &cq) {
// 生产者线程不断生成并添加字符串
for (size_t i = 0; ; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(25));
cq.push("Producer generated string " + std::to_string(i));
}
}
void consumer(CacheQueue &cq) {
// 消费者线程每隔25ms读取并消费字符串
while (true) {
std::string data = cq.read(1000);
if (data.empty()) {
std::cout << "Cache is empty, reading all data.\n";
} else {
std::cout << "Consumed " << data.size() << " characters:\n" << data << "\n";
}
}
}
int main() {
CacheQueue cq;
std::thread producerThread(producer, std::ref(cq));
std::thread consumerThread(consumer, std::ref(cq));
producerThread.join(); // 等待生产者线程结束
consumerThread.join(); // 等待消费者线程结束
return 0;
}
```
在这个例子中,`producer()`线程每25毫秒生成一个新的字符串并放入队列,`consumer()`线程每轮读取1000个字符。如果队列内不足1000个字符,则会读取整个队列的内容。
阅读全文