タスクのスケジューリングとスレッド プールの管理は、C 同時プログラミングの効率とスケーラビリティを向上させる鍵となります。タスクのスケジュール: std::thread を使用して新しいスレッドを作成します。スレッドに参加するには、join() メソッドを使用します。スレッド プールの管理: ThreadPool オブジェクトを作成し、スレッドの数を指定します。 add_task() メソッドを使用してタスクを追加します。 join() または stop() メソッドを呼び出して、スレッド プールをシャットダウンします。
#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; };
メソッドを使用して、タスクをスレッド プールに追加します。
または
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 サイトの他の関連記事を参照してください。