[Rust 并发编程] 互斥锁的简单使用

yufei       3 年, 9 月 前       2804

因为 Rust 语法的特殊性,Rust 的锁还是比较简单的。

Rust 创建任意一种锁的步骤如下

  1. 使用 std::sync::Mutex 创建一个读写锁。记住,变量要使用 to_owned() 转移所有权

  2. 使用 std::sync::Arc 创建要在多线程环境中使用的原子性变量 arc。怎么说呢,就是给上面创建的锁添加一个自动引用计数。

  3. 使用 arc.clone()Arc::clone() 方法克隆或复制多个引用变量实例,方便在每个线程中使用一个。

  4. 在一个新的作用域中,比如多线程或者 {} 中调用 arc.lock() 获取锁并操作数据,当然啦,获取锁可能失败。

  5. 不需要调用 arc.unlock(),因为 Rust 离开作用域之后就会自动释放锁。

是不是很简单?

写了一个小小的范例

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

//互斥锁范例
fn main() {
    // 定义一个需要在多线程环境中使用的变量
    let s = String::from("你好啊");

    // 创建互斥锁,创建时需要转移所有权;
    let mutex = Mutex::new(s.to_owned());

    // 创建原子性操作1
    let lock = Arc::new(mutex);

    // 创建原子性操作2
    let lock2 = lock.clone();

    // 创建一个线程,然后修改 s
    let hdl = thread::spawn(move||{
        // 获取锁
        lock2.lock().unwrap().push_str(" thread ");
        // 释放锁
        // 不用主动释放的原因是,Rust 会记住 lock() 时的作用域,离开作用域会自动释放
    });

    // 在主线程中操作
    // 需要一个块来定义 lock() 方法的作用域
    {
        // 获取锁
        lock.lock().unwrap().push_str(" main ");
        // 释放锁
        // 不用主动释放的原因是,Rust 会记住 lock() 时的作用域,离开作用域会自动释放
    }

    hdl.join().unwrap();
    println!("{:?}",lock);
}
目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.