在C++中,std::set
是一個基于紅黑樹實現的關聯容器,它會自動對元素進行排序。然而,std::set
并不是線程安全的,因此在多線程環境下使用它可能會導致數據競爭和不一致的結果。
為了在多線程環境下對std::set
進行排序,你可以采用以下方法:
std::mutex
)保護對std::set
的訪問。在對std::set
進行操作時,首先鎖定互斥鎖,然后執行操作,最后解鎖互斥鎖。這樣可以確保在同一時間只有一個線程可以訪問std::set
。#include <iostream>
#include <set>
#include <mutex>
#include <thread>
std::set<int> my_set;
std::mutex mtx;
void insert(int value) {
std::lock_guard<std::mutex> lock(mtx);
my_set.insert(value);
}
void print() {
std::lock_guard<std::mutex> lock(mtx);
for (const auto& item : my_set) {
std::cout << item << " ";
}
std::cout << std::endl;
}
int main() {
std::thread t1(insert, 5);
std::thread t2(insert, 3);
std::thread t3(insert, 1);
std::thread t4(insert, 4);
std::thread t5(insert, 2);
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
print();
return 0;
}
std::concurrent_set
(C++20中引入)。這個容器在內部實現了適當的同步機制,以確保在多線程環境下的安全性。#include <iostream>
#include <concurrent_set>
#include <thread>
int main() {
std::concurrent_set<int> my_set;
std::thread t1([&my_set]() { my_set.insert(5); });
std::thread t2([&my_set]() { my_set.insert(3); });
std::thread t3([&my_set]() { my_set.insert(1); });
std::thread t4([&my_set]() { my_set.insert(4); });
std::thread t5([&my_set]() { my_set.insert(2); });
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
for (const auto& item : my_set) {
std::cout << item << " ";
}
std::cout << std::endl;
return 0;
}
請注意,std::concurrent_set
在C++20中引入,因此你需要確保你的編譯器支持C++20標準。如果你的編譯器不支持C++20,你可以使用第一種方法,即使用互斥鎖保護對std::set
的訪問。