C++ 通过std::shared_lock(共享锁)和std::shared_mutex(共享互斥量)实现读写锁

        在 C++ 标准库中,`std::map` 是一个单线程容器,不直接支持并发读写操作。如果在多线程环境中需要对 `std::map` 进行读写操作,你需要手动添加互斥锁来保护并发访问,以防止数据竞争和不一致性。

        然而,C++11 引入了标准库的并发支持,其中包括了 `std::shared_mutex`(共享互斥锁)和 `std::map` 结合使用的方法。`std::shared_mutex` 支持读写分离的锁策略,允许多个线程并发地读取数据,但在写入数据时会互斥锁定。

以下是一个使用 `std::shared_mutex` 来实现读写安全的 `std::map` 的示例:

#include 
#include 
#include 
#include 

std::map myMap;
std::shared_mutex mapMutex;

void writeMap(int key, int value) {
    std::unique_lock lock(mapMutex);
    myMap[key] = value;
}

int readMap(int key) {
    std::shared_lock lock(mapMutex);
    auto it = myMap.find(key);
    if (it != myMap.end()) {
        return it->second;
    } else {
        return -1; // 返回默认值,表示未找到
    }
}

int main() {
    std::thread writer(writeMap, 1, 100);
    std::thread reader(readMap, 1);

    writer.join();
    reader.join();

    return 0;

        在上述示例中,我们使用 `std::shared_mutex` 来保护对 `myMap` 的并发访问。`writeMap` 函数使用 `std::unique_lock` 来获得独占的写入访问权限,而 `readMap` 函数使用 `std::shared_lock` 来获得共享的读取访问权限。这样,在写入数据时会阻止其他线程的任何访问,而在读取数据时可以允许多个线程同时访问。

        需要注意的是,C++17 引入了 `std::shared_mutex`,如果你的编译环境支持 C++17,可以使用上述示例。如果不支持,你可以考虑使用第三方的并发容器库,如 `tbb::concurrent_hash_map`,它为多线程环境下的并发读写提供了更好的性能支持。

你可能感兴趣的:(C++,c++,服务器,后端)