ホームページ > バックエンド開発 > C++ > C++ 同時プログラミング: タスクのスケジューリングとスレッド プール管理を実行する方法は?

C++ 同時プログラミング: タスクのスケジューリングとスレッド プール管理を実行する方法は?

WBOY
リリース: 2024-05-06 10:15:02
オリジナル
1042 人が閲覧しました

タスクのスケジューリングとスレッド プールの管理は、C 同時プログラミングの効率とスケーラビリティを向上させる鍵となります。タスクのスケジュール: std::thread を使用して新しいスレッドを作成します。スレッドに参加するには、join() メソッドを使用します。スレッド プールの管理: ThreadPool オブジェクトを作成し、スレッドの数を指定します。 add_task() メソッドを使用してタスクを追加します。 join() または stop() メソッドを呼び出して、スレッド プールをシャットダウンします。

C++ 同時プログラミング: タスクのスケジューリングとスレッド プール管理を実行する方法は?

#C 同時プログラミング: タスクのスケジュールとスレッド プールの管理

はじめに

並行プログラミングでは、アプリケーションの効率とスケーラビリティを向上させるために、タスクのスケジューリングとスレッド プールの管理が重要です。この記事では、C でのタスク スケジューリングの概念を説明し、C 11 標準の

std::thread および std::mutex を使用してスレッド プールを管理する方法を示します。

タスク スケジューリング

タスク スケジューリングには、非同期タスクの割り当てと実行が含まれます。 C では、

std::thread を使用して新しいスレッドを作成できます:

std::thread t([]() {
  // 执行异步任务
});
ログイン後にコピー

スレッドに参加するには、

join() メソッドを使用します:

t.join();
ログイン後にコピー

スレッド プール管理

スレッド プールは、タスクの処理に使用できる、事前に作成および管理されるスレッドのコレクションです。スレッド プールを使用すると、スレッドの作成と破棄を繰り返すオーバーヘッドが回避されます。

C でスレッド プールを作成および管理する方法は次のとおりです。

class ThreadPool {
public:
  ThreadPool(int num_threads) {
    for (int i = 0; i < num_threads; i++) {
      threads_.emplace_back(std::thread([this]() { this->thread_loop(); }));
    }
  }

  void thread_loop() {
    while (true) {
      std::function<void()> task;

      {
        std::lock_guard<std::mutex> lock(mtx_);
        if (tasks_.empty()) {
          continue;
        }

        task = tasks_.front();
        tasks_.pop();
      }

      task();
    }
  }

  void add_task(std::function<void()> task) {
    std::lock_guard<std::mutex> lock(mtx_);
    tasks_.push(task);
  }

  void stop() {
    std::unique_lock<std::mutex> lock(mtx_);
    stop_ = true;
  }

  ~ThreadPool() {
    stop();

    for (auto& t : threads_) {
      t.join();
    }
  }

private:
  std::vector<std::thread> threads_;
  std::queue<std::function<void()>> tasks_;
  std::mutex mtx_;
  bool stop_ = false;
};
ログイン後にコピー

スレッド プールを使用するには、次の手順を実行できます。

    スレッドを作成するプール オブジェクト、作成するスレッドの数を指定します。
  1. add_task() メソッドを使用して、タスクをスレッド プールに追加します。
  2. join() または stop() メソッドを呼び出してスレッド プールを閉じ、すべてのタスクが完了するまで待ちます。

実際的なケース

次に、スレッド プールを使用してマルチコア システム上で同時タスクを実行する例を示します:

#include <iostream>
#include <vector>
#include "thread_pool.h"

int main() {
  ThreadPool pool(4);

  std::vector<std::future<int>> futures;
  for (int i = 0; i < 10000; i++) {
    futures.push_back(pool.add_task([i]() { return i * i; }));
  }

  for (auto& f : futures) {
    std::cout << f.get() << std::endl;
  }

  return 0;
}
ログイン後にコピー

結論

C の同時タスクは、

std::thread とスレッド プールを使用することで効果的に管理できます。マルチコア システム上の科学技術コンピューティングであっても、大量のリクエストを処理する必要がある Web サービスであっても、スレッド スケジューリングとスレッド プール管理は、コードの効率とスケーラビリティを向上させる鍵となります。

以上がC++ 同時プログラミング: タスクのスケジューリングとスレッド プール管理を実行する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート