是否有设施可以锁定Rust中的多个互斥锁,同时防止死锁?

ust*_*ion 14 mutex rust

std::lock()在Rust中是否有像C++ 这样的工具来防止像这样的代码中的死锁:

type Type0 = Arc<Mutex<u8>>;
type Type1 = Arc<Mutex<u16>>;

fn foo(a: Type0, b: Type1) {
    let a_guard = a.lock().unwrap();
    let b_guard = b.lock().unwrap();
}

fn bar(a: Type0, b: Type1) {
    let b_guard = b.lock().unwrap();
    let a_guard = a.lock().unwrap();
}
Run Code Online (Sandbox Code Playgroud)

如果foo由thread-0和barthread-1 调用,则可能出现死锁.有什么东西,希望变量,因为我可以有超过2,帮助我这个或我自己验证锁定顺序的正确性?

以下文档std::lock:

锁定给定Lockable对象lock1,lock2,...,lockn使用死锁避免算法,以避免死锁.

tre*_*tcl 7

,Rust 没有相当于 C++ 的功能std::lock

\n

基于它似乎不在std::sync文档中的事实中并且谷歌搜索没有带来任何有用的信息这一事实,我对这个断言非常有信心。

\n

为什么不?好吧,如果我可以进行一些社论,std::lock它并不像您希望的那样广泛有用。避免死锁并非易事,每种算法都会有可能导致性能不佳甚至活锁的极端情况。不存在一刀切的死锁避免算法。\xc2\xb9(请参阅Is std::lock() ill-define, unimplementable, or 无用?)将死锁避免lock函数放入标准库中表明它这是一个很好的默认选择,并且可能鼓励它的使用而不考虑它的实现。大多数现实生活中的应用程序可能会使用更简单(且不太通用)的算法。

\n

有些板条箱可以通过其他方式避免死锁。例如,tracing-mutex提供了在运行时创建依赖图的锁定类型,如果依赖图包含循环,则会出现恐慌而不是死锁。parking_lot有一个实验性deadlock_detection功能(但我不确定它是如何工作的)。奇怪的是,我没有找到任何提供 C++std::sort等效功能的包。

\n

不管怎样,没有什么可以阻止你编写自己的“后退”算法来解决这个问题;它只是不是标准库的一部分。

\n
\n

\xc2\xb9 公平地说,你可以对 Rust 拥有的其他函数做出相同的论点,比如[T]::sort. 但在许多应用中,排序不是瓶颈,任何相当快的算法就足够了。一般来说,避免死锁不太可能是必要的,而且当它确实出现时,它更有可能对性能敏感。

\n


小智 6

Mutex如果它是一个包含值的元组,那么这个问题很容易解决,因此锁定元组会同时锁定两个值。

let tuple_mutex = Arc::new(Mutex::new((A, B)));
Run Code Online (Sandbox Code Playgroud)

  • 很好,但可能想保留独立价值观的灵活性。 (6认同)
  • @SimonElliott 在这个解决方案中只有一个“Mutex”;它用于锁定复合值。这些值被同时锁定,因为它们由同一互斥锁控制。 (2认同)