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

文章介绍了如何在C++中使用std::shared_mutex来确保std::map在多线程环境中的并发安全,支持读写分离。C++11后提供了std::shared_mutex,C++17则进一步增强了并发支持。
摘要由CSDN通过智能技术生成

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

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

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

#include <iostream>
#include <map>
#include <shared_mutex>
#include <thread>

std::map<int, int> myMap;
std::shared_mutex mapMutex;

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

int readMap(int key) {
    std::shared_lock<std::shared_mutex> 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`,它为多线程环境下的并发读写提供了更好的性能支持。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值