任務排程和執行緒池管理是 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; }
結論
透過使用std::thread 和執行緒池,可以有效地管理C 中的並發任務。無論是多核心系統上的科學運算還是需要處理大量請求的 Web 服務,執行緒調度和執行緒池管理都是提高程式碼效率和可擴展性的關鍵。
以上是C++並發程式設計:如何進行任務排程和執行緒池管理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!