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. 在实际应用中,你还需要考虑其他并发问题,如死锁、饥饿等,并可能需要使用更复杂的同步原语或策略来管理并发访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值