线程池通过复用线程减少创建销毁开销并控制并发,C++中可用std::thread、std::queue、std::mutex和std::condition_variable实现;其核心包括工作线程集合、任务队列、同步机制与生命周期管理;通过enqueue提交任务,使用std::packaged_task和std::future获取返回值,互斥锁保护队列,条件变量通知任务到达;析构时需停止新任务、唤醒线程并join,确保资源释放;示例中创建4线程池提交10个任务,验证了线程安全与结果获取;关键在于正确处理同步、避免死锁、异常安全及及时唤醒。

线程池的核心目标是复用线程、减少频繁创建销毁带来的开销,同时控制并发数量。在C++中,借助std::thread、std::queue、std::mutex和std::condition_variable,可以实现一个高效且线程安全的线程池。
一个典型的线程池包含以下几个部分:
std::function<void()>)。用户通过enqueue方法提交任务,线程池将任务推入队列并唤醒一个工作线程。每个线程循环等待任务,取出后立即执行。
使用std::packaged_task可以方便地获取任务返回值,结合std::future实现异步结果获取。
立即学习“C++免费学习笔记(深入)”;
示例代码片段:
template<class F>
auto enqueue(F&& f) -> std::future<typename std::invoke_result_t<F>> {
using return_type = typename std::invoke_result_t<F>;
<pre class='brush:php;toolbar:false;'>auto task = std::make_shared<std::packaged_task<return_type()>>(std::forward<F>(f));
std::future<return_type> res = task->get_future();
{
std::unique_lock<std::mutex> lock(queue_mutex);
tasks.emplace([task]() { (*task)(); });
}
condition.notify_one();
return res;}
任务队列必须被互斥锁保护,避免多个线程同时修改导致数据竞争。条件变量配合wait使用时需注意虚假唤醒,通常用while循环检查条件。
在线程池析构时,应设置停止标志,唤醒所有等待线程,并join它们,确保资源正确释放。
关键点:
stop()方法,防止新任务进入。shared_ptr管理任务,避免裸指针。创建4个线程的线程池,提交10个打印任务:
ThreadPool pool(4);
std::vector<std::future<int>> results;
<p>for (int i = 0; i < 10; ++i) {
results.emplace_back(pool.enqueue([i] {
std::cout << "Task " << i << " running on thread "
<< std::this_thread::get_id() << '\n';
return i * i;
}));
}</p><p>// 获取结果
for (auto& f : results) {
std::cout << "Result: " << f.get() << '\n';
}</p>基本上就这些。一个简洁高效的线程池不需要复杂设计,重点是线程安全、资源管理和易用性。不复杂但容易忽略细节,比如异常安全和及时唤醒。
以上就是C++如何实现一个线程池_C++多线程并发与线程池设计的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号