首頁 > 後端開發 > C++ > 主體

C++並發程式設計初探

WBOY
發布: 2023-08-21 22:18:34
原創
650 人瀏覽過

隨著電腦硬體效能的不斷提升,人們對於多核心處理的需要也越來越強烈。同時,現代作業系統也提供了越來越完善的並發程式支持,這使得同時進行程式設計成為了程式設計領域中不可或缺的一部分。在這個背景下,C 作為一門廣泛使用的高效能程式語言,也提供了許多強大的並發程式設計工具和函式庫。

本文將介紹一些基本的C 並發程式設計概念和技術,並透過簡單的範例程式碼來展示它們的使用。

多執行緒基礎

多執行緒是一種常用的並發程式設計模型,它允許程式同時執行多條指令流。在C 中,多執行緒程式設計可以透過標準庫中的頭檔來完成。下面是一個簡單的使用多執行緒的範例程式碼:

#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 中,可以使用標準庫中的頭檔來實現互斥鎖。下面是一個簡單的使用互斥鎖的範例程式碼:

#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 中,可以使用標準庫中的頭檔來實現原子操作。下面是一個簡單的使用原子操作的範例程式碼:

#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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板