隨著電腦硬體效能的不斷提升,人們對於多核心處理的需要也越來越強烈。同時,現代作業系統也提供了越來越完善的並發程式支持,這使得同時進行程式設計成為了程式設計領域中不可或缺的一部分。在這個背景下,C 作為一門廣泛使用的高效能程式語言,也提供了許多強大的並發程式設計工具和函式庫。
本文將介紹一些基本的C 並發程式設計概念和技術,並透過簡單的範例程式碼來展示它們的使用。
多執行緒基礎
多執行緒是一種常用的並發程式設計模型,它允許程式同時執行多條指令流。在C 中,多執行緒程式設計可以透過標準庫中的61fe42cd48946e53c78c0e2bbfbc7b04頭檔來完成。下面是一個簡單的使用多執行緒的範例程式碼:
#include <iostream> #include <thread> void hello() { std::cout << "Hello" << std::endl; } int main() { std::thread t(hello); t.join(); return 0; }
該程式碼定義了一個名為hello的函數,該函數會輸出字串"Hello"。在main函數中,程式建立了一個新的執行緒t,並將hello函數作為該執行緒的執行函數。 t.join()語句等待該執行緒執行結束後再退出程式。
互斥鎖
由於多執行緒同時執行,可能會同時存取相同的共用資源。這時候就需要一種機制來保證對於任意時刻,只有一個執行緒可以存取該共享資源。這種機制就是互斥鎖。
在C 中,可以使用標準庫中的e517c9ed30f2300c1c910dc75c8db2c8頭檔來實現互斥鎖。下面是一個簡單的使用互斥鎖的範例程式碼:
#include <iostream> #include <thread> #include <mutex> std::mutex m; int sum = 0; void add() { m.lock(); sum += 1; m.unlock(); } int main() { std::thread t1(add); std::thread t2(add); t1.join(); t2.join(); std::cout << "sum = " << sum << std::endl; return 0; }
該程式碼定義了一個名為add的函數,該函數會將全域變數sum加1。在main函數中,程式建立了兩個新執行緒t1和t2,並將add函數作為它們的執行函數。由於sum是一個共享資源,因此在add函數中使用了互斥鎖m保證對sum的存取是線程安全的。
原子操作
原子操作是一種特殊的操作,它可以在不加鎖的情況下對共享資源進行更新或讀取。在C 中,可以使用標準庫中的15a199175b5d79b4bf26b73c4a2287fc頭檔來實現原子操作。下面是一個簡單的使用原子操作的範例程式碼:
#include <iostream> #include <thread> #include <atomic> std::atomic<int> sum(0); void add() { sum += 1; } int main() { std::thread t1(add); std::thread t2(add); t1.join(); t2.join(); std::cout << "sum = " << sum << std::endl; return 0; }
程式定義了一個名為sum的原子變量,它的初始值為0。在add函數中,使用了原子操作sum = 1將sum的值加1。在main函數中,程式建立了兩個新執行緒t1和t2,並將add函數作為它們的執行函數。由於sum是原子變量,因此原子操作sum = 1可以保證線程安全。
總結
本文介紹了C 中的並發程式設計基礎知識,包括多執行緒、互斥鎖和原子操作。當然,C 提供的並發程式設計工具和函式庫遠不止這些,例如條件變數、信號量、執行緒池等等。在實際專案中,選擇合適的並發程式設計工具和函式庫對於確保程式的正確性、提高程式效能和可維護性都有著重要的意義。
以上是C++並發程式設計初探的詳細內容。更多資訊請關注PHP中文網其他相關文章!