当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust RwLock用法及代码示例


本文简要介绍rust语言中 Struct std::sync::RwLock 的用法。

用法

pub struct RwLock<T: ?Sized> { /* fields omitted */ }

reader-writer 锁

这种类型的锁在任何时间点允许多个读取器或最多一个写入器。此锁的写入部分通常允许修改底层数据(独占访问),而此锁的读取部分通常允许只读访问(共享访问)。

相比之下, Mutex 不区分获取锁的读取器或写入器,因此阻塞任何等待锁可用的线程。只要写入者不持有锁,RwLock 将允许任意数量的读取者获取锁。

锁的优先级策略取决于底层操作系统的实现,这种类型不保证会使用任何特定的策略。特别是,等待获取 write 中的锁的写入器可能会或可能不会阻止对 read 的并发调用,例如:

潜在的死锁示例
// Thread 1             |  // Thread 2
let _rg = lock.read();  |
                        |  // will block
                        |  let _wg = lock.write();
// may deadlock         |
let _rg = lock.read();  |

类型参数T 表示该锁保护的数据。要求T满足 Send 跨线程共享和 Sync 允许读者并发访问。从锁定方法返回的 RAII 守卫实现 Deref (以及write 方法的 DerefMut )以允许访问锁的内容。

中毒

RwLock ,如 Mutex ,会因Panics而中毒。但是请注意,RwLock 只有在被独占锁定(写入模式)时发生Panics时才会中毒。如果任何读者发生Panics,那么锁就不会中毒。

例子

use std::sync::RwLock;

let lock = RwLock::new(5);

// many reader locks can be held at once
{
    let r1 = lock.read().unwrap();
    let r2 = lock.read().unwrap();
    assert_eq!(*r1, 5);
    assert_eq!(*r2, 5);
} // read locks are dropped at this point

// only one write lock may be held, however
{
    let mut w = lock.write().unwrap();
    *w += 1;
    assert_eq!(*w, 6);
} // write lock is dropped here

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Struct std::sync::RwLock。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。