C++ 併發



併發是指系統能夠在任何給定時間管理多個任務或程序,並允許它們在不等待彼此完成的情況下進行的能力。併發系統中的任務可以在執行中重疊,這最終有助於提高效率和資源利用率,尤其是在作業系統、資料庫和 Web 伺服器等環境中。

C++ 中的併發

在 C++ 中,併發幫助開發人員建立可以執行多個操作的應用程式,並有助於提高其效率和響應能力。併發可以透過多種方式發生,例如透過多執行緒、非同步程式設計或分散式系統。

併發與並行

併發是指以重疊方式管理不同任務或處理器的能力,這意味著任務可以在不同的時間啟動、執行和完成。這意味著任務可能不會同時執行,但它們的執行可以在時間上重疊,從而有效利用可用資源。

並行是併發的子類別,其中任務實際上是在不同的處理器或核心上併發執行以提高效能。

併發處理結構和任務管理,而並行則專注於同時執行以加快計算速度。

執行緒

執行緒表示程序內最小的執行單元,它允許多個任務獨立併發執行。<thread> 用於建立和管理執行緒。執行緒並行執行並共享相同的記憶體空間。

示例

以下是 C++ 中執行緒的一個簡單示例:

#include <iostream>
#include <thread>

void hello() {
   std::cout << "Hello Learner!" << std::endl;
}

int main() {
   std::thread t(hello);
   t.join();  // Wait for the thread to finish
   return 0;
}

輸出

Hello Learner!

C++ 中的執行緒同步

C++ 中的執行緒同步是一種機制,它管理多個執行緒對共享資源的訪問,以防止資料競爭、不一致和未定義的行為。它確保一次只有一個執行緒可以訪問資源,或者特定操作按特定順序執行,尤其是在多個執行緒併發執行時。

C++ 中執行緒同步的關鍵方法

以下是 C++ 中執行緒同步的一些關鍵方法:

互斥量(<mutex> 庫)

互斥量(互斥)是一種鎖定機制,它限制對共享資源的訪問,以便一次只有一個執行緒可以訪問它。如果一個執行緒鎖定了互斥量,則嘗試鎖定相同互斥量的其他執行緒將被阻塞,直到互斥量被解鎖。

std::lock_guard 和 std::unique_lock

std::lock_guard 是一個基本的自動鎖管理器,它在建立時鎖定互斥量,並在超出範圍時解鎖它。

std::unique_lock 更加靈活,允許手動解鎖和重新鎖定。

條件變數(<condition_variable> 庫)

它使執行緒能夠等待直到滿足某些條件,這有助於執行緒之間的通訊。

std::condition_variable 通常與 std::unique_lock<std::mutex> 一起使用,並提供 wait()、notify_one() 和 notify_all() 函式,用於根據特定條件阻塞和恢復執行緒。

原子變數(<atomic> 庫)

原子操作是另一種在不使用互斥量的情況下確保執行緒安全的方法。

原子變數保證任何讀-修改-寫操作都在沒有其他執行緒干擾的情況下完成,這對於整數或布林值等簡單資料型別很有用。

原子操作包括 fetch_add、load、store 和 compare_exchange。

訊號量

訊號量是一種同步原語,它在併發系統(如多執行緒或多程序環境)中管理對共享資源的訪問。訊號量本質上是一個整數,它控制對資源的訪問。它基於兩個主要操作:

  • 等待(P 或獲取):減少訊號量值。
  • 訊號(V 或釋放):增加訊號量值。

C++ 中的非同步執行

在 C++ 中,std::futurestd::promise 是用於非同步程式設計的機制,它們有助於管理資料或線上程之間進行結果通訊,允許一個執行緒提供結果(透過 std::promise)而另一個執行緒檢索它(透過 std::future)。這些是 C++11 標準的一部分,可以在 <future> 標頭檔案中找到。

非同步程式設計的關鍵元件

  • std::future - 它表示非同步操作的未來結果。一個執行緒可以在結果可用時從 future 中檢索結果,如果結果未準備好,std::future::get() - 函式將阻塞直到計算出值。
  • std::promise - 它用於設定稍後可以透過 std::future 檢索的值或異常。
  • std::async - 它用於非同步啟動任務。它返回一個 std::future,該 future 可用於在任務完成後獲取任務的結果。
廣告