43·并发编程进阶

RwLock 读写锁

RwLock 读写锁

学习目标

  1. 理解读写锁的场景
  2. 掌握 RwLock<T> 使用
  3. 理解与 Mutex 的区别

核心概念

基本用法

use std::sync::RwLock;

fn main() {
    let lock = RwLock::new(5);

    // 多个读取可以并发
    {
        let r1 = lock.read().unwrap();
        let r2 = lock.read().unwrap();
        println!("r1={}, r2={}", r1, r2);
    }

    // 写入是排他的
    {
        let mut w = lock.write().unwrap();
        *w = 6;
    }

    println!("value: {}", *lock.read().unwrap());
}

多线程读写

use std::sync::{Arc, RwLock};
use std::thread;

fn main() {
    let data = Arc::new(RwLock::new(vec![1, 2, 3]));
    let mut handles = vec![];

    // 多个读者
    for i in 0..3 {
        let data = Arc::clone(&data);
        handles.push(thread::spawn(move || {
            let r = data.read().unwrap();
            println!("读者 {}: {:?}", i, *r);
        }));
    }

    // 一个写者
    let data_clone = Arc::clone(&data);
    handles.push(thread::spawn(move || {
        let mut w = data_clone.write().unwrap();
        w.push(4);
        println!("写者完成: {:?}", *w);
    }));

    for h in handles { h.join().unwrap(); }
}

Mutex vs RwLock

类型场景
Mutex排他排他读写均衡
RwLock并发排他读多写少

小结

操作语法
读锁rwlock.read()
写锁rwlock.write()
多线程共享Arc<RwLock<T>>

练习编辑器

rust
Loading...