溫馨提示×

C++ set排序在多線程環境下怎樣

c++
小樊
117
2024-11-30 19:05:53
欄目: 編程語言

在C++中,std::set是一個基于紅黑樹實現的關聯容器,它會自動對元素進行排序。然而,std::set并不是線程安全的,因此在多線程環境下使用它可能會導致數據競爭和不一致的結果。

為了在多線程環境下對std::set進行排序,你可以采用以下方法:

  1. 使用互斥鎖(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;
}
  1. 使用線程安全的容器,如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的訪問。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女