在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
个对象lock1
,lock2
,...
,lockn
以避免死锁。
答案 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;算法解决了这个问题;它不属于标准库。