C++ 线程池实现:高效并发执行任务
C++ 线程池实现:高效并发执行任务
以下是一个简单的 C++ 线程池实现,用于高效执行并发任务。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <functional>
class ThreadPool {
public:
ThreadPool(int numThreads = std::thread::hardware_concurrency()) {
for (int i = 0; i < numThreads; ++i) {
threads_.emplace_back([this] {
while (true) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock{mutex_};
condition_.wait(lock, [this] { return !tasks_.empty() || stop_; });
if (stop_ && tasks_.empty()) {
return;
}
task = std::move(tasks_.front());
tasks_.pop();
}
task();
}
});
}
}
~ThreadPool() {
{
std::unique_lock<std::mutex> lock{mutex_};
stop_ = true;
}
condition_.notify_all();
for (auto& thread : threads_) {
thread.join();
}
}
template<typename Func, typename... Args>
void enqueue(Func&& func, Args&&... args) {
auto task = std::make_shared<std::packaged_task<void()>>(std::bind(std::forward<Func>(func), std::forward<Args>(args)...));
{
std::unique_lock<std::mutex> lock{mutex_};
tasks_.emplace([task] { (*task)(); });
}
condition_.notify_one();
}
private:
std::vector<std::thread> threads_;
std::queue<std::function<void()>> tasks_;
std::mutex mutex_;
std::condition_variable condition_;
bool stop_ = false;
};
// 测试代码
int main() {
ThreadPool pool;
for (int i = 0; i < 10; ++i) {
pool.enqueue([](int num) {
std::cout << 'Task ' << num << ' is running.' << std::endl;
}, i);
}
return 0;
}
使用说明:
使用 ThreadPool 类可以创建一个指定数量的线程池,并将需要执行的任务提交到线程池中。在 enqueue 函数中,将任务包装为 std::function 类型,并将其保存到任务队列中。每个线程会不断地从任务队列中取出任务并执行,直到线程池被销毁。当线程池被销毁时,会向所有线程发送停止信号,并等待所有线程退出。
原文地址: https://www.cveoy.top/t/topic/mwcQ 著作权归作者所有。请勿转载和采集!