首頁  >  文章  >  後端開發  >  C++並發程式設計:如何進行任務排程和執行緒池管理?

C++並發程式設計:如何進行任務排程和執行緒池管理?

WBOY
WBOY原創
2024-05-06 10:15:021020瀏覽

任務排程和執行緒池管理是 C 並發程式設計中提高效率和可擴展性的關鍵。任務調度:使用 std::thread 建立新執行緒。使用 join() 方法加入執行緒。執行緒池管理:建立 ThreadPool 對象,指定執行緒數量。使用 add_task() 方法新增任務。呼叫 join() 或 stop() 方法關閉執行緒池。

C++並發程式設計:如何進行任務排程和執行緒池管理?

C 並發程式設計:任務排程與執行緒池管理

##簡介

在同時編程中,任務調度和執行緒池管理對於提高應用程式的效率和可擴展性至關重要。本文將引導您了解 C 中任務調度的概念,並展示如何使用 C 11 標準中的

std::threadstd::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. 使用
  2. add_task() 方法將任務加入到執行緒池。
  3. 呼叫
  4. 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;
}

結論

透過使用

std::thread 和執行緒池,可以有效地管理C 中的並發任務。無論是多核心系統上的科學運算還是需要處理大量請求的 Web 服務,執行緒調度和執行緒池管理都是提高程式碼效率和可擴展性的關鍵。

以上是C++並發程式設計:如何進行任務排程和執行緒池管理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn