首页 > 后端开发 > C++ > C 11 中的线程池如何工作?

C 11 中的线程池如何工作?

Mary-Kate Olsen
发布: 2024-12-27 13:58:10
原创
282 人浏览过

How Does Thread Pooling Work in C  11?

C 11 中的线程池

简介

线程池是一种管理线程池的技术可以动态分配任务的线程集。与在每个任务上创建和销毁线程相比,它具有多种优势,包括提高性能和资源效率。

了解线程池

在 C 11 中,线程池通常是使用线程、互斥体和条件变量的组合来实现。线程在后台创建并启动,任务被添加到队列中。工作人员不断监视队列,等待新任务可用。一旦任务可用,worker 将检索并执行它。

创建线程池

要创建线程池,我们可以定义一个 ThreadPool 类:

class ThreadPool {
public:
    void Start();
    void QueueJob(const std::function<void()>& job);
    void Stop();
    bool busy();

private:
    void ThreadLoop();

    bool should_terminate = false;
    std::mutex queue_mutex;
    std::condition_variable mutex_condition;
    std::vector<std::thread> threads;
    std::queue<std::function<void()>> jobs;
};
登录后复制

管理主题Pool

  • Start: 通过创建和启动工作线程来启动线程池。
  • QueueJob: 添加新线程任务到队列中供工作人员执行执行。
  • 停止: 通过为工作线程设置终止标志并等待它们完成来停止线程池。
  • 忙: 检查如果线程池正忙(即,有任务在

工作线程循环

每个工作线程运行一个无限循环来等待和执行任务:

void ThreadPool::ThreadLoop() {
    while (true) {
        std::function<void()> job;
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            mutex_condition.wait(lock, [this] {
                return !jobs.empty() || should_terminate;
            });
            if (should_terminate) {
                return;
            }
            job = jobs.front();
            jobs.pop();
        }
        job();
    }
}
登录后复制

使用线程池

使用线程线程池,只需创建一个实例并调用 QueueJob 来添加任务:

ThreadPool thread_pool;
thread_pool.Start();
thread_pool.QueueJob([] { /* ... */ });
登录后复制

线程池的优点

  • 提高性能:通过重用线程,我们消除了每个任务创建和销毁线程的开销。
  • 资源效率:任务中的线程数量可以根据工作负载进行调整,从而节省资源。
  • 简化代码:线程池抽象了线程的管理,使您的代码更简洁,更易于维护。

以上是C 11 中的线程池如何工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板