首頁  >  文章  >  後端開發  >  C++類別設計中如何處理並發控制?

C++類別設計中如何處理並發控制?

WBOY
WBOY原創
2024-06-02 21:20:01319瀏覽

C 中的同時控制使用互斥量(一次存取臨界區)、條件變數(等待條件滿足)、讀寫鎖定(允許多個讀者同時讀,但寫入只能一個)等機制,以解決共享資源並發存取導致的資料競爭和不一致狀態。

C++類別設計中如何處理並發控制?

C 類別設計中的並發控制

引言

在多執行緒環境中,共享資源的並發存取可能會導致數據競爭和不一致的狀態。為了解決這個問題,C 提供了多種機制來處理並發控制。

互斥量

互斥量是一個同步原語,它允許一次只有一個執行緒存取臨界區。我們可以使用std::mutex 類別來建立一個互斥量:

std::mutex mutex;

要存取臨界區,執行緒必須取得互斥量的鎖定:

mutex.lock();
// 访问临界区
mutex.unlock();

條件變數

條件變數是一個同步原語,它允許一個執行緒等待另一個執行緒完成特定的條件。我們可以使用std::condition_variable 類別來建立一個條件變數:

std::condition_variable cv;

執行緒可以透過呼叫wait() 方法來等待條件:

cv.wait(mutex);

當條件滿足時,另一個執行緒可以呼叫notify_one()notify_all() 方法來通知等待的執行緒:

cv.notify_one();
cv.notify_all();

讀取寫鎖

讀寫鎖定是一種同步原語,它允許多個執行緒同時讀取共享資源,但一次只有一個執行緒可以寫入共享資源。我們可以使用std::shared_mutex 類別來建立讀寫鎖定:

std::shared_mutex rw_mutex;

要讀取共享資源,執行緒可以取得讀鎖:

rw_mutex.lock_shared();
// 读取共享资源
rw_mutex.unlock_shared();

要寫入共享資源,執行緒可以取得寫鎖:

rw_mutex.lock();
// 写入共享资源
rw_mutex.unlock();

實戰案例

考慮一個簡單的銀行帳戶類,它包含一個餘額成員變數和一個用於存取款的方法:

class BankAccount {
public:
    BankAccount(int initial_balance) : balance(initial_balance) {}
    
    void deposit(int amount) {
        balance += amount;
    }
    
    void withdraw(int amount) {
        if (amount <= balance) {
            balance -= amount;
        }
    }
    
private:
    int balance;
};

為了處理並發訪問,我們可以使用互斥量來保護餘額成員變數:

class BankAccount {
public:
    BankAccount(int initial_balance) : balance(initial_balance) {}
    
    void deposit(int amount) {
        std::lock_guard<std::mutex> lock(mutex);
        balance += amount;
    }
    
    void withdraw(int amount) {
        std::lock_guard<std::mutex> lock(mutex);
        if (amount <= balance) {
            balance -= amount;
        }
    }
    
private:
    std::mutex mutex;
    int balance;
};

現在,我們可以安全地從多個執行緒並發存取銀行帳戶。

以上是C++類別設計中如何處理並發控制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn