隨著電腦硬體效能的不斷提升,人們對於多核心處理的需要也越來越強烈。同時,現代作業系統也提供了越來越完善的並發程式支持,這使得同時進行程式設計成為了程式設計領域中不可或缺的一部分。在這個背景下,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中文網其他相關文章!