多线程之读写锁(unique_lock与shared_lock)

本文介绍了Boost库中提供的读写锁实现方式,通过shared_lock和unique_lock结合shared_mutex类来区分读锁与写锁。读锁允许多个线程同时进行读操作,而写锁则确保了写操作的互斥性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Boost库提供了share_mutex类,结合unique_lock与shared_lock的使用,可以实现读写锁。

typedef boost::shared_lock<boost::shared_mutex> read_lock;
typedef boost::unique_lock<boost::shared_mutex> write_lock;

      shared_lock是read lock。被锁后仍允许其他线程执行同样被shared_lock的代码。这是一般做读操作时的需要。
//共享锁,也叫多线程锁,当data被线程A读取时,仍允许其它线程读取data,但是不能写入。


      unique_lock是write lock。被锁后不允许其他线程执行被shared_lock或unique_lock的代码。在写操作时,一般用这个,可以同时限制unique_lock的写和share_lock的读。
//独占锁,也叫单线程锁,仅允许单个线程访问,该线程访问结束后,其它线程才可以访问,避免输入写入冲突。
//即,当data被线程A写入时,其它线程既不能读取,也不能写入。

关于互斥锁(mutex)可查看:多线程之互斥锁(mutex)的使用方法

`std::unique_lock` 是 C++17 引入的一个容器适配器,用于管理互斥锁(mutex)。它是 `std::lock_guard` 的更通用版本,适用于那些不能使用 RAII(Resource Acquisition Is Initialization)技术的资源,如共享所有权或非自动释放的锁。 如果你想锁定一个共有(shared)变量并确保多个线程同时读取该变量,你应该使用 `std::shared_mutex` 而不是普通 mutex。`std::shared_mutex` 支持读写操作,当有多个读锁时,读操作是互不冲突的;但如果有写锁,则所有其他线程都会被阻塞。 以下是如何使用 `std::unique_lock` 来锁定 `std::shared_mutex` 的例子: ```cpp #include <thread> // std::thread #include <mutex> // std::shared_mutex, std::unique_lock #include <atomic> // std::atomic for shared data // 假设我们有一个 shared counter 变量 std::atomic<int> shared_counter(0); // 创建一个 shared_mutex 对象 std::shared_mutex counter_lock; void reader_thread() { std::unique_lock<std::shared_mutex> lock(counter_lock); while (shared_counter.load() <= 5) { // 读取计数器,直到达到某个条件 std::cout << "Reader: Counter is " << shared_counter.load() << "\n"; } } void writer_thread() { std::unique_lock<std::shared_mutex> lock(counter_lock, std::defer_lock); // 尝试获取写锁 lock.lock(); // 当没有其他读者时,这里获得锁 // 更新计数器 shared_counter.fetch_add(1); // 释放锁,允许其他读者进来 lock.unlock(); } int main() { std::thread reader(reader_thread); std::thread writer(writer_thread); reader.join(); writer.join(); return 0; } ``` 在这个例子中,reader_thread 和 writer_thread 分别尝试读取和更新 `shared_counter`,通过 `shared_mutex` 实现读写操作的并发控制。注意,writer_thread 需要先用 `std::defer_lock` 初始化锁,然后在获得锁之前检查是否有其他读者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值