如何在 C 函數中實現線程安全的資料結構?使用互斥鎖保護臨界區(共享資料)。執行緒安全的動態數組範例:使用互斥鎖保護 std::vector 中的資料。實戰案例:執行緒安全的佇列,使用互斥鎖和條件變數來實現訊息佇列的執行緒安全性。
如何在 C 函數中實作執行緒安全的資料結構?
在多執行緒應用程式中,並發存取共享資料可能會導致競態條件和資料損壞。因此,至關重要的是對共享的資料結構進行線程安全,以確保每個線程都能安全地存取和修改資料。
實作執行緒安全資料結構的簡單方法是使用互斥鎖。互斥鎖是一種同步原語,它允許一次只有一個執行緒存取臨界區(共享資料)。以下程式碼範例展示如何使用互斥鎖保護動態數組中的資料:
#include <mutex> #include <vector> std::mutex m; // 线程安全的动态数组 class ThreadSafeVector { public: void push_back(int value) { std::lock_guard<std::mutex> lock(m); v.push_back(value); } int get(size_t index) { std::lock_guard<std::mutex> lock(m); return v[index]; } private: std::vector<int> v; }; int main() { ThreadSafeVector v; v.push_back(1); int value = v.get(0); // ... }
此範例中,std::lock_guard
用作RAII(資源取得即初始化)封裝,它在進入臨界區時自動取得互斥鎖,並在退出臨界區時自動釋放互斥鎖。這確保了在同一時間只有一個執行緒能存取 v
向量。
實戰案例:線程安全的佇列
假設我們有一個多執行緒應用程序,執行緒需要共享一個訊息佇列。為了讓佇列執行緒安全,可以使用互斥鎖和條件變數來實現:
#include <mutex> #include <condition_variable> #include <queue> std::mutex m; std::condition_variable cv; class ThreadSafeQueue { public: void push(int value) { std::lock_guard<std::mutex> lock(m); q.push(value); cv.notify_one(); } int pop() { std::unique_lock<std::mutex> lock(m); cv.wait(lock, [this]{ return !q.empty(); }); int value = q.front(); q.pop(); return value; } private: std::queue<int> q; }; int main() { ThreadSafeQueue q; // ... }
在這種情況下,std::condition_variable
用於通知執行緒佇列中是否有新的消息。 std::unique_lock
用於鎖定和解鎖互斥鎖,同時也可以透過 cv.wait()
方法讓執行緒進入休眠狀態,直到佇列中有新訊息。
以上是如何在 C++ 函數中實作線程安全的資料結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!