Home > Backend Development > C++ > How to Efficiently Implement a Thread Pool in C 11 to Avoid Repeated Thread Creation and Deletion Overhead?

How to Efficiently Implement a Thread Pool in C 11 to Avoid Repeated Thread Creation and Deletion Overhead?

Patricia Arquette
Release: 2024-12-13 14:27:11
Original
530 people have browsed it

How to Efficiently Implement a Thread Pool in C  11 to Avoid Repeated Thread Creation and Deletion Overhead?

Thread Pooling in C 11

Issue: Creating and deleting threads repeatedly is expensive. How can we establish a persistent thread pool to handle tasks without incurring this overhead?

Solution:

Implementing the ThreadPool Class

To create an efficient thread pool, we first define the ThreadPool class:

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;
};
Copy after login

1. ThreadPool::Start:

Creates a fixed number of threads based on system capabilities:

void ThreadPool::Start() {
    const uint32_t num_threads = std::thread::hardware_concurrency();
    for (uint32_t ii = 0; ii < num_threads; ++ii) {
        threads.emplace_back(std::thread(&ThreadPool::ThreadLoop,this))
    }
}
Copy after login

2. ThreadPool::ThreadLoop:

Endless loop that waits for new tasks:

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();
    }
}
Copy after login

3. ThreadPool::QueueJob:

Adds a new task to the pool:

void ThreadPool::QueueJob(const std::function<void()>& job) {
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        jobs.push(job);
    }
    mutex_condition.notify_one();
}
Copy after login

4. ThreadPool::busy:

Checks if the pool has active jobs:

bool ThreadPool::busy() {
    bool poolbusy;
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        poolbusy = !jobs.empty();
    }
    return poolbusy;
}
Copy after login

5. ThreadPool::Stop:

Gracefully stops the pool:

void ThreadPool::Stop() {
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        should_terminate = true;
    }
    mutex_condition.notify_all();
    for (std::thread& active_thread : threads) {
        active_thread.join();
    }
    threads.clear();
}
Copy after login

Usage:

thread_pool->QueueJob([] { /* ... */ });
Copy after login

This implementation provides a dynamic thread pool where threads persistently run and wait for tasks to be added.

The above is the detailed content of How to Efficiently Implement a Thread Pool in C 11 to Avoid Repeated Thread Creation and Deletion Overhead?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template