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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-27 13:58:10220浏览

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