首頁  >  文章  >  後端開發  >  使用 C++ STL 時如何處理並發存取?

使用 C++ STL 時如何處理並發存取?

王林
王林原創
2024-06-04 18:20:00642瀏覽

在並發存取共享資料結​​構中,C++ STL 提供了處理資料競爭的機制:互斥:僅允許一個執行緒同時存取共享資料;讀寫鎖:允許多個執行緒同時讀取但只有一個執行緒寫入;原子操作:無需鎖就能進行簡單的操作,如計數器遞增。

使用 C++ STL 时如何处理并发访问?

如何使用C++ STL 處理並發存取

在並發程式設計中,並發存取共享資料結​​構可能會導致資料競爭和程式崩潰。 C++ 標準範本庫 (STL) 為處理此類場景提供了強大的機制。

互斥 (互斥鎖)

互斥量是一種輕量級鎖定,僅允許一個執行緒同時存取共享資料。以下是使用互斥量保護std::vector 的範例:

#include <iostream>
#include <mutex>
#include <vector>

std::mutex vector_mutex;
std::vector<int> shared_vector;

void thread_function() {
  std::lock_guard<std::mutex> lock(vector_mutex);
  // 访问 shared_vector,知道不会被其他线程并发访问
}

讀寫鎖定

##讀寫鎖定允許多個執行緒同時讀取共享數據,但僅允許一個執行緒寫入。以下是使用讀寫鎖定保護

std::map 的範例:

#include <iostream>
#include <shared_mutex>
#include <map>

std::shared_mutex map_mutex;
std::map<std::string, int> shared_map;

void reader_thread_function() {
  std::shared_lock<std::shared_mutex> lock(map_mutex);
  // 读取 shared_map
}

void writer_thread_function() {
  std::unique_lock<std::shared_mutex> lock(map_mutex);
  // 写入 shared_map
}

#原子操作

對於簡單的操作(如遞增或遞減計數器),我們可以使用原子操作,無需使用鎖。以下是使用原子操作更新

int 的範例:

#include <atomic>

std::atomic<int> shared_counter;

void thread_function() {
  shared_counter.fetch_add(1);
}

實戰案例

以下是使用C++ STL 並發的真實案例:

Web 服務並發存取共享快取

問題:一個Web 服務使用std::unordered_map 作為緩存,多個線程同時存取快取。

解決方案:使用讀寫鎖定保護 std::unordered_map。這允許多個執行緒同時讀取緩存,而只允許一個執行緒更新緩存,從而避免資料競爭。

以上是使用 C++ STL 時如何處理並發存取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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