如何在 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() 方法使線程進入休眠狀態,直到隊列中有新消息。







