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

C++並發程式設計:如何進行執行緒同步與互斥?

王林
發布: 2024-05-05 10:00:02
原創
797 人瀏覽過

執行緒同步在多執行緒並發存取共享資源時至關重要。 C 提供了互斥體、條件變數和原子操作來實現同步。互斥體確保一次僅一個執行緒存取資源;條件變數用於執行緒間通訊;原子操作可確保單一操作不可中斷執行。例如,使用互斥體同步對共用佇列的訪問,以防止資料損壞。

C++並發程式設計:如何進行執行緒同步與互斥?

C 並發程式設計:線程同步與互斥

概述

線程同步是確保多個執行緒同時存取共享資源時保持資料完整性的關鍵。 C 提供了多種機制來實現執行緒同步,包括互斥體、條件變數和原子操作。

互斥體 (Mutex)

互斥體是一種對象,它允許一次只有一個執行緒存取共享資源。互斥體的使用方法如下:

std::mutex m;

void func() {
  std::lock_guard<std::mutex> lock(m);  // 获取互斥体锁
  // 访问共享资源
  // ...
}
登入後複製

std::lock_guard是一種 RAII 類型,表示對互斥體的鎖定。當func() 函數執行完時,鎖定會自動釋放。

條件變數 (Condition Variable)

條件變數用於執行緒之間的通訊。它允許一個線程等待,直到另一個線程滿足某些條件。使用方法如下:

std::condition_variable cv;

void wait() {
  std::unique_lock<std::mutex> lock(m);
  cv.wait(lock);  // 等待条件变量
}

void notify() {
  std::unique_lock<std::mutex> lock(m);
  cv.notify_one();  // 通知等待的线程
}
登入後複製

std::unique_lock表示對互斥體的獨佔鎖定。當wait()函數被呼叫時,執行緒將被阻塞,直到notify_one()函數被呼叫。

原子操作

原子運算是一種低階的同步機制,它可以確保單一操作不可中斷地執行。使用方式如下:

std::atomic<int> counter;

void increment() {
  counter++;  // 原子地递增计数器
}
登入後複製

實戰案例

考慮這樣一個場景:多個執行緒正在存取一個共享的佇列,並且佇列的大小是有上限的。為了防止執行緒同時存取佇列並導致資料損壞,我們可以使用互斥體來同步對佇列的存取:

std::mutex m;
std::queue<int> queue;
const int MAX_SIZE = 10;  // 队列最大容量

void producer() {
  while (true) {
    std::lock_guard<std::mutex> lock(m);
    if (queue.size() < MAX_SIZE) {
      queue.push(rand());
    }
  }
}

void consumer() {
  while (true) {
    std::lock_guard<std::mutex> lock(m);
    if (!queue.empty()) {
      std::cout << queue.front() << std::endl;
      queue.pop();
    }
  }
}
登入後複製

以上是C++並發程式設計:如何進行執行緒同步與互斥?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!