c++编写一个线程池
时间: 2024-10-24 22:14:00 浏览: 12
在 C++ 中,创建一个线程池可以帮助管理一组并发任务,避免频繁地创建和销毁新线程,提高性能和资源利用率。下面是一个简单的线程池实现示例,使用了 `<thread>` 和 `std::queue`:
```cpp
#include <iostream>
#include <queue>
#include <vector>
#include <thread>
#include <mutex>
class ThreadPool {
public:
ThreadPool(size_t num_threads) : stop(false), threads(num_threads) {
for (size_t i = 0; i < num_threads; ++i) {
workers.emplace_back([this] {
while (!stop) {
processTask();
}
});
}
}
~ThreadPool() {
stop = true;
joinAllThreads();
}
template<typename Func, typename... Args>
void enqueue(Func&& func, Args&&... args) {
std::lock_guard<std::mutex> lock(queue_mutex);
tasks.push(std::make_tuple(func, std::forward<Args>(args)...));
}
private:
void processTask() {
if (!tasks.empty()) {
auto task = tasks.front();
tasks.pop();
executeTask(std::move(task));
} else {
this_thread::yield(); // 防止 CPU 过度切换
}
}
void executeTask(std::tuple<Func, Args...>&& task) {
try {
std::apply(std::ref(callback), std::move(task));
} catch (...) {
std::cerr << "Error executing task!" << std::endl;
}
}
void joinAllThreads() {
for (auto& worker : workers) {
worker.join();
}
}
bool stop;
std::queue<std::tuple<Func, Args...>> tasks;
std::vector<std::thread> workers;
mutable std::mutex queue_mutex;
std::function<void(Func, Args...)>& callback = [](Func f, Args... a) { f(a...); }; // 临时函数用于保存任务
};
int main() {
ThreadPool pool(4);
for (int i = 0; i < 10; ++i) {
pool.enqueue([](int n) { std::cout << "Task " << n << " running on thread " << std::this_thread::get_id() << '\n'; }, i);
}
pool.joinAllThreads();
return 0;
}
```
这个简单线程池的主要部分包括线程列表、一个队列用于存放待处理的任务,以及一个函数模板用于封装用户提供的回调函数。当用户提交任务时,它会添加到队列,然后唤醒并运行一个空闲的线程。
阅读全文