首页 > 后端开发 > C++ > 正文

C++ 多线程编程中线程池的使用场景有哪些?

WBOY
发布: 2024-05-26 14:36:01
原创
1237人浏览过

线程池用于管理线程,通过维护预分配的线程池来减少线程开销。具体场景包括:减少线程创建和销毁开销;管理并发性,防止资源耗尽;提高代码简洁性,消除线程管理细节。

C++ 多线程编程中线程池的使用场景有哪些?

C++ 多线程编程中线程池的使用场景

线程池是一种管理线程的机制,它可以提高多线程编程的效率和性能。在 C++ 中,可以通过使用 std::threadstd::condition_variable标准库来实现线程池。

以下是一些使用线程池的常见场景:

立即学习C++免费学习笔记(深入)”;

LimeSurvey在线问卷管理系统
LimeSurvey在线问卷管理系统

LimeSurvey是一款在线问卷管理系统,具有问卷的设计、修改、发布、回收和统计等多项功能。同时它也是一个开源软件,其最新版本的软件包可以完全免费获取和使用。它集成了调查程序开发、调查问卷的发布以及数据收集等功能,使用它,用户不必了解这些功能的编程细节。 网上收集的调查数据可以导出多种文件格式以便分析,例如 spss数据格式 *.dat文件。

LimeSurvey在线问卷管理系统 198
查看详情 LimeSurvey在线问卷管理系统
  • 减少线程创建和销毁的开销:创建和销毁线程是一个相对昂贵的操作。线程池通过维护一个预先分配的线程池来避免这个开销。
  • 管理并发性:线程池可以限制同时执行的线程数量,这对于防止系统资源耗尽非常重要。
  • 提高代码简洁性:线程池可以简化多线程编程,因为它消除了管理线程本身的繁琐细节。

实战案例

以下是一个使用 std::threadstd::condition_variable 在 C++ 中实现线程池的示例:

#include <condition_variable>
#include <iostream>
#include <mutex>
#include <queue>
#include <thread>
#include <vector>

using namespace std;

// 线程池类
class ThreadPool {
public:
    ThreadPool(int num_threads) : stop(false) {
        // 创建指定数量的线程并将其添加到线程池
        for (int i = 0; i < num_threads; i++) {
            threads.emplace_back([this] {
                while (!stop) {
                    unique_lock<mutex> lock(mtx);
                    if (!tasks.empty()) {
                        // 从任务队列中获取任务
                        auto task = tasks.front();
                        tasks.pop();
                        // 执行任务
                        task();
                        // 通知条件变量任务已完成
                        cv.notify_one();
                    } else {
                        // 如果任务队列为空,则等待新任务
                        cv.wait(lock);
                    }
                }
            });
        }
    }

    ~ThreadPool() {
        // 停止所有线程
        stop = true;
        cv.notify_all();

        // 等待所有线程完成
        for (auto& thread : threads) {
            thread.join();
        }
    }

    // 向任务队列添加任务
    void enqueue(function<void()> &&task) {
        unique_lock<mutex> lock(mtx);
        tasks.push(move(task));
        // 通知条件变量有新任务
        cv.notify_one();
    }

private:
    bool stop;  // 线程池停止标志
    mutex mtx;  // 用于保护任务队列和条件变量
    condition_variable cv;  // 用于等待新任务
    queue<function<void()>> tasks;  // 任务队列
    vector<thread> threads;  // 线程池中的线程
};

int main() {
    // 创建具有 4 个线程的线程池
    ThreadPool pool(4);

    // 向线程池添加 10 个任务
    for (int i = 0; i < 10; i++) {
        pool.enqueue([i] {
            cout << "Task " << i << " executed by thread " << this_thread::get_id() << endl;
        });
    }

    return 0;
}
登录后复制

在这个例子中,我们创建了一个 ThreadPool 类,它维护一个预先分配的线程池。任务通过 enqueue 函数添加到任务队列中。线程池中的线程持续不断地从任务队列中获取任务并执行它们。当任务队列为空时,线程会等待条件变量被通知,表明有新任务可用。

输出如下所示:

Task 0 executed by thread 139670130218816
Task 1 executed by thread 139670129941952
Task 2 executed by thread 139670130082240
Task 3 executed by thread 139670130226176
Task 4 executed by thread 139670129949696
Task 5 executed by thread 139670130233920
Task 6 executed by thread 139670129957440
Task 7 executed by thread 139670130090080
Task 8 executed by thread 139670130241664
Task 9 executed by thread 139670129965184
登录后复制

以上就是C++ 多线程编程中线程池的使用场景有哪些?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号