首頁  >  文章  >  後端開發  >  如何在 C++ 函數中實作線程安全的資料結構?

如何在 C++ 函數中實作線程安全的資料結構?

王林
王林原創
2024-04-27 08:33:02763瀏覽

如何在 C 函數中實現線程安全的資料結構?使用互斥鎖保護臨界區(共享資料)。執行緒安全的動態數組範例:使用互斥鎖保護 std::vector 中的資料。實戰案例:執行緒安全的佇列,使用互斥鎖和條件變數來實現訊息佇列的執行緒安全性。

如何在 C++ 函数中实现线程安全的数据结构?

如何在 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中文網其他相關文章!

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