C++ 的 std::set
本身并不是線程安全的。在多線程環境下使用 std::set
時,需要采取一定的同步措施來避免數據競爭和不一致的問題。
一種常見的方法是使用互斥鎖(std::mutex
)來保護對 std::set
的訪問。可以定義一個包含 std::set
和互斥鎖的結構體,然后在訪問 std::set
時使用互斥鎖進行加鎖和解鎖操作。例如:
#include <iostream>
#include <set>
#include <mutex>
struct ThreadSafeSet {
std::set<int> data;
std::mutex mtx;
};
void insert(ThreadSafeSet& set, int value) {
std::lock_guard<std::mutex> lock(set.mtx);
set.data.insert(value);
}
void remove(ThreadSafeSet& set, int value) {
std::lock_guard<std::mutex> lock(set.mtx);
set.data.erase(value);
}
int main() {
ThreadSafeSet set;
std::thread t1(insert, std::ref(set), 1);
std::thread t2(insert, std::ref(set), 2);
std::thread t3(remove, std::ref(set), 1);
t1.join();
t2.join();
t3.join();
return 0;
}
在這個例子中,我們定義了一個 ThreadSafeSet
結構體,其中包含一個 std::set
和一個 std::mutex
。然后我們定義了 insert
和 remove
函數,這兩個函數使用 std::lock_guard
對互斥鎖進行加鎖和解鎖操作,以確保在訪問 std::set
時不會發生數據競爭。最后在 main
函數中,我們創建了三個線程來并發地插入和刪除元素,并使用 join
函數等待線程結束。
除了使用互斥鎖外,還可以使用其他同步機制,如讀寫鎖(std::shared_mutex
)或條件變量(std::condition_variable
)等,來根據具體的需求選擇合適的同步策略。