Rust标准库中的互斥(Mutex)

Rust标准库中的互斥(Mutex)

https://doc.rust-lang.org/std/sync/struct.Mutex.html

用于保护共享数据的互斥原语

这个mutex将阻止等待锁可用的线程。mutex也可以被静态初始化或通过 new 构造函数创建。每个mutex都有一个 type 参数,表示它所保护的数据。这些数据只能通过 lock 和 try_lock 返回的 RAII 守护来访问,这保证了只有当mutex被锁定时,数据才会被访问。

毒化/Poisoning

这个模块中的 mutex 实现了一种叫做 " poisoning “的策略,每当持有 mutex 的线程恐慌时,就会认为 mutex 中毒。一旦 mutex 被毒化,所有其他线程都无法默认访问该数据,因为它很可能被污染了(某些不变性没有被维护)。

对于mutex来说,这意味着 lock 和 try_lock 方法会返回一个Result值,表示mutex是否被毒化。大多数使用mutex的方法都会简单地将这些结果 unwrap(),在线程之间传播恐慌,以确保不会出现可能无效的变量。

然而,被毒化的 mutex 并不会阻止对底层数据的所有访问。PoisonError 类型有一个 into_inner 方法,它将返回在成功锁定时返回的守护。这样,尽管锁被毒化了,但仍然可以访问数据。

new方法

在解锁状态下创建一个新的mutex,可以随时使用。

pub fn new(t: T) -> Mutex<T>

use std::sync::Mutex;

let mutex = Mutex::new(0);

lock方法

获取一个mutex,阻塞当前线程,直到它能够这样做。

这个函数将阻塞本地线程,直到它可以获取mutex为止。返回后,该线程是唯一一个持有锁的线程。返回一个RAII守护,允许范围化解锁。当保护罩超出范围时,mutex将被解锁。

在已经持有锁的线程中锁定一个mutex的确切行为没有说明。但是,这个函数在第二次调用时不会返回(例如,它可能会出现恐慌或死锁)。

try_lock方法

尝试获取此锁。

如果此时无法获得该锁,则返回Err。否则,将返回一个RAII护卫。当护卫被丢弃时,该锁将被解锁。

此功能不阻塞。