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