在並發存取共享資料結構中,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中文網其他相關文章!