ホームページ >バックエンド開発 >C++ >スレッドの作成と削除のオーバーヘッドの繰り返しを回避するために、C 11 でスレッド プールを効率的に実装するにはどうすればよいですか?

スレッドの作成と削除のオーバーヘッドの繰り返しを回避するために、C 11 でスレッド プールを効率的に実装するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-13 14:27:11531ブラウズ

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

C 11 のスレッド プーリング

問題: スレッドの作成と削除を繰り返すとコストがかかります。このオーバーヘッドを発生させずにタスクを処理する永続スレッド プールを確立するにはどうすればよいですか?

解決策:

ThreadPool クラスの実装

効率的なスレッド プールを作成するには、まず 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;
};

1. ThreadPool::Start:

システム機能に基づいて固定数のスレッドを作成します:

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))
    }
}

2。 ThreadPool::ThreadLoop:

新しいタスクを待機する無限ループ:

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

3. ThreadPool::QueueJob:

新しいタスクをプールに追加します:

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

4. ThreadPool::busy:

プールにアクティブなジョブがあるかどうかを確認します:

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

5. ThreadPool::Stop:

プールを正常に停止します:

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

Usage:

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

この実装は、動的スレッドが永続的に実行され、タスクが追加されるのを待つスレッド プール。

以上がスレッドの作成と削除のオーバーヘッドの繰り返しを回避するために、C 11 でスレッド プールを効率的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。