首頁 >後端開發 >C++ >C++ 多執行緒程式設計中如何有效率地管理共享資源?

C++ 多執行緒程式設計中如何有效率地管理共享資源?

PHPz
PHPz原創
2024-06-04 18:52:031119瀏覽

在 C++ 多執行緒程式設計中,使用 mutex 和條件變數可以有效率地管理共享資源,避免資料競爭和死鎖:互斥量 (Mutex) 允許一次只允許一個執行緒存取資源,保證資料完整性。條件變數 (Condition Variable) 用於協調執行緒協作,允許一個執行緒等待另一個執行緒執行特定動作。在實戰案例中,生產者執行緒向緩衝區添加數據並通知消費者,消費者執行緒等待生產者通知後從緩衝區讀取數據,透過互斥量和條件變數確保執行緒安全存取共享資源。

C++ 多线程编程中如何高效地管理共享资源?

C++ 多執行緒程式設計:高效管理共享資源

在多執行緒程式設計中,共享資源的存取控制至關重要。本文將說明如何在 C++ 中使用 mutex 和條件變數等同步原語來有效率地管理共享資源,避免資料競爭和死鎖。

互斥量 (Mutex)

互斥量是保護共享資源免於同時存取的關鍵機制。它允許一次只允許一個執行緒存取資源,從而保證資料完整性。

std::mutex m;  // 创建一个互斥量

void access_resource() {
  std::lock_guard<std::mutex> lock(m);  // 加锁
  // 对共享资源执行操作
  lock.unlock();  // 解锁
}

條件變數 (Condition Variable)

條件變數用於協調執行緒協作。它允許一個線程等待另一個線程執行特定動作。

std::condition_variable cv;  // 创建一个条件变量
std::mutex m;  // 创建一个与条件变量关联的互斥量

void produce() {
  std::unique_lock<std::mutex> lock(m);
  // 生产数据
  lock.unlock();
  cv.notify_one();  // 通知消费者生产完成
}

void consume() {
  std::unique_lock<std::mutex> lock(m);
  // 等待生产者通知
  cv.wait(lock);
  // 消费数据
  lock.unlock();
}

實戰案例

以下是使用 mutex 和條件變數管理共享資源的簡單範例。它使用一個緩衝區來儲存數據,生產者執行緒往緩衝區添加數據,而消費者執行緒則從緩衝區讀取數據。

#include <mutex>
#include <condition_variable>
#include <thread>
#include <vector>

std::mutex m;
std::condition_variable cv;

std::vector<int> buffer;  // 共享资源缓冲区

void produce() {
  while (true) {
    std::lock_guard<std::mutex> lock(m);
    buffer.push_back(rand());
    cv.notify_one();
  }
}

void consume() {
  while (true) {
    std::unique_lock<std::mutex> lock(m);
    cv.wait(lock, [] { return !buffer.empty(); });
    int data = buffer.back();
    buffer.pop_back();
  }
}

int main() {
  std::thread t1(produce);
  std::thread t2(consume);
  t1.join();
  t2.join();
  return 0;
}

透過使用 mutex 和條件變量,我們確保了生產者和消費者執行緒可以同時存取緩衝區,但不會出現資料競爭。

以上是C++ 多執行緒程式設計中如何有效率地管理共享資源?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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