c++ 读写锁简单试验

在C++中,读写锁(也称为共享-独占锁或读写互斥量)允许对共享资源的并发访问,其中多个读取者可以同时访问资源,但写入者需要独占访问。C++11标准库提供了std::shared_mutexstd::shared_lock来支持读写锁的功能。

以下是一个简单的C++程序,演示了如何使用std::shared_mutexstd::shared_lock进行读写锁的试验:

#include <iostream>  
#include <thread>  
#include <vector>  
#include <shared_mutex>  
#include <unordered_map>  
  
// 假设我们有一个需要并发访问的共享资源  
std::unordered_map<int, std::string> shared_data;  
std::shared_mutex mtx; // 读写锁  
  
// 写入函数  
void write_data(int key, const std::string& value) {  
    std::unique_lock<std::shared_mutex> lock(mtx); // 使用unique_lock进行独占锁定  
    shared_data[key] = value;  
    std::cout << "Wrote data: " << key << " -> " << value << std::endl;  
}  
  
// 读取函数  
void read_data(int key) {  
    std::shared_lock<std::shared_mutex> lock(mtx); // 使用shared_lock进行共享锁定  
    if (shared_data.find(key) != shared_data.end()) {  
        std::cout << "Read data: " << key << " -> " << shared_data[key] << std::endl;  
    } else {  
        std::cout << "Key " << key << " not found." << std::endl;  
    }  
}  
  
int main() {  
    // 启动写入线程  
    std::thread writer(write_data, 1, "Hello");  
  
    // 启动多个读取线程  
    std::vector<std::thread> readers;  
    for (int i = 0; i < 5; ++i) {  
        readers.emplace_back(read_data, 1);  
    }  
  
    // 等待所有线程完成  
    writer.join();  
    for (auto& t : readers) {  
        t.join();  
    }  
  
    return 0;  
}

注意

  1. std::unique_lock<std::shared_mutex>用于独占锁定,即写入操作。在独占锁定期间,其他线程无法获取任何类型的锁(无论是独占锁还是共享锁)。
  2. std::shared_lock<std::shared_mutex>用于共享锁定,即读取操作。在共享锁定期间,其他线程可以获取共享锁(但不能获取独占锁),从而实现多个读取者同时访问资源。
  3. 由于线程调度的不确定性,输出顺序可能会不同。但是,你应该能够观察到写入操作在读取操作之前完成,并且多个读取操作可以同时进行。
  4. 在实际应用中,你还需要考虑其他并发问题,如死锁、饥饿等,并可能需要使用更复杂的同步原语或策略来管理并发访问。

相关推荐

  1. c++ 简单试验

    2024-05-14 04:10:03       12 阅读
  2. c++ 对比试验

    2024-05-14 04:10:03       11 阅读
  3. QT c++ 简单举例

    2024-05-14 04:10:03       15 阅读
  4. C++

    2024-05-14 04:10:03       22 阅读
  5. c++ 自旋和可打断

    2024-05-14 04:10:03       14 阅读
  6. 关于Redission

    2024-05-14 04:10:03       16 阅读
  7. 乐观、悲观、互斥

    2024-05-14 04:10:03       8 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-14 04:10:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-14 04:10:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-14 04:10:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-14 04:10:03       18 阅读

热门阅读

  1. 数学符号大全

    2024-05-14 04:10:03       14 阅读
  2. 几种ssh自动登录服务器的方法

    2024-05-14 04:10:03       9 阅读
  3. Linux系统日志每日备份脚本

    2024-05-14 04:10:03       10 阅读
  4. getter和setter方法的优缺点

    2024-05-14 04:10:03       12 阅读
  5. leetcode 918.环形子数组的最大和

    2024-05-14 04:10:03       10 阅读
  6. JanusGraph Tinkerpop

    2024-05-14 04:10:03       9 阅读
  7. 船舶检测数据集VOC+YOLO格式7000张6类别

    2024-05-14 04:10:03       11 阅读
  8. 【GoLang基础】panic和recover有什么作用?

    2024-05-14 04:10:03       11 阅读
  9. c++ string容器

    2024-05-14 04:10:03       10 阅读