如何在 c++++ 函數中實現線程安全的數據結構?使用互斥鎖保護臨界區(共享數據)。線程安全的動態數組示例:使用互斥鎖保護 std::vector 中的數據。實戰案例:線程安全的隊列,使用互斥鎖和條件變量實現消息隊列的線程安全。
如何在 C++ 函數中實現線程安全的數據結構?
在多線程應用程序中,并發訪問共享數據可能會導致競態條件和數據損壞。因此,至關重要的是對共享的數據結構進行線程安全,以確保每個線程都能安全地訪問和修改數據。
實現線程安全數據結構的一種簡單方法是使用互斥鎖?;コ怄i是一種同步原語,它允許一次只有一個線程訪問臨界區(共享數據)。以下代碼示例展示了如何使用互斥鎖保護動態數組中的數據:
#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()
方法使線程進入休眠狀態,直到隊列中有新消息。