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

时间:2016-09-08 14:02:00

标签: rust mutex

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

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();
}

如果线程0调用foo而线程1调用bar,则存在死锁的可能性。有什么东西,希望变量,因为我可以有超过2,帮助我这个,还是我自己验证锁定顺序的正确性?

来自the documentation for std::lock

  

使用死锁避免算法锁定给定的Lockable个对象lock1lock2...lockn以避免死锁。

2 个答案:

答案 0 :(得分:2)

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

let tuple_mutex = Arc::new(Mutex::new((A, B)));

答案 1 :(得分:2)

,Rust没有(或者还没有)具有与C ++ std::lock等效的功能。

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

为什么不呢?好吧,如果我可以稍微进行一些编辑,那么std::lock并不是一个好主意 - 死锁避免是非常重要的,并且每个算法都会有合理的极端情况导致性能不佳甚至活锁。没有一种适合所有人的死锁避免算法。

(你可以为Rust确实拥有的其他函数提供相同的参数,例如Vec::sort,但我认为在性能不重要的许多应用程序中需要&#34;排序&#34;并且任何合理的对于大约75%的应用程序,排序算法的性能足够高。只有当你编写的代码需要运行良好时,才能避免死锁。)

此外,在标准库中放置一个避免死锁的lock函数表明它是一个很好的默认选项,并鼓励其使用而不考虑其实现。实际上,大多数应用程序可能会通过更简单(且通用性更低)的算法做得更好。

无论如何,没有什么可以阻止你自己编写&#34;退出&#34;算法解决了这个问题;它不属于标准库。