c++ 协程池 代码
时间: 2025-01-03 17:34:01 浏览: 11
在C++中,协程池是一种用于高效管理并发任务的技术,它通过预先创建一定数量的线程,并按照任务需求分发它们,避免了频繁地创建和销毁线程带来的性能开销。以下是一个简单的C++17协程池的示例,使用`std::coroutine`库:
```cpp
#include <iostream>
#include <thread>
#include <vector>
#include <queue>
// 定义协程函数模板
template <typename Func>
class CoroutinePool {
public:
explicit CoroutinePool(size_t size) : worker_count_(size), tasks_(size) {}
// 提交任务到队列
void Enqueue(Func&& func) {
tasks_.emplace_back(std::move(func));
}
private:
void Worker() {
while (true) {
if (!tasks_.empty()) {
std::packaged_task<void()> task = tasks_.front();
tasks_.pop();
task.call(); // 调用协程
} else {
std::this_thread::yield(); // 空闲时让出处理器时间
}
}
}
std::vector<std::packaged_task<void()>> tasks_;
std::vector<std::thread> workers_;
size_t worker_count_; // 工作线程数量
void StartWorkers() {
for (size_t i = 0; i < worker_count_; ++i) {
workers_.emplace_back(&CoroutinePool::Worker, this);
}
}
~CoroutinePool() {
for (auto& worker : workers_) {
worker.join(); // 等待所有工作线程结束
}
}
};
// 使用示例
int main() {
CoroutinePool<int> pool(4); // 创建一个包含4个线程的协程池
// 提交一些工作
for (int i = 0; i < 10; ++i) {
auto id = i;
pool.Enqueue([id] {
std::cout << "Task " << id << " running by coroutine pool" << std::endl;
});
}
pool.StartWorkers(); // 启动协程池
return 0;
}
```
在这个例子中,`Enqueue`方法将协程的任务添加到队列,每个worker线程会从队列取出并执行任务。当所有任务完成并且队列为空时,`~CoroutinePool`析构函数会等待所有工作线程结束。
阅读全文