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,帮助我这个或我自己验证锁定顺序的正确性?
锁定给定
Lockable对象lock1,lock2,...,lockn使用死锁避免算法,以避免死锁.
不,Rust 没有相当于 C++ 的功能std::lock。
基于它似乎不在std::sync文档中的事实中并且谷歌搜索没有带来任何有用的信息这一事实,我对这个断言非常有信心。
为什么不?好吧,如果我可以进行一些社论,std::lock它并不像您希望的那样广泛有用。避免死锁并非易事,每种算法都会有可能导致性能不佳甚至活锁的极端情况。不存在一刀切的死锁避免算法。\xc2\xb9(请参阅Is std::lock() ill-define, unimplementable, or 无用?)将死锁避免lock函数放入标准库中表明它这是一个很好的默认选择,并且可能鼓励它的使用而不考虑它的实现。大多数现实生活中的应用程序可能会使用更简单(且不太通用)的算法。
有些板条箱可以通过其他方式避免死锁。例如,tracing-mutex提供了在运行时创建依赖图的锁定类型,如果依赖图包含循环,则会出现恐慌而不是死锁。parking_lot有一个实验性deadlock_detection功能(但我不确定它是如何工作的)。奇怪的是,我没有找到任何提供 C++std::sort等效功能的包。
不管怎样,没有什么可以阻止你编写自己的“后退”算法来解决这个问题;它只是不是标准库的一部分。
\n\xc2\xb9 公平地说,你可以对 Rust 拥有的其他函数做出相同的论点,比如[T]::sort. 但在许多应用中,排序不是瓶颈,任何相当快的算法就足够了。一般来说,避免死锁不太可能是必要的,而且当它确实出现时,它更有可能对性能敏感。
小智 6
Mutex如果它是一个包含值的元组,那么这个问题很容易解决,因此锁定元组会同时锁定两个值。
let tuple_mutex = Arc::new(Mutex::new((A, B)));
Run Code Online (Sandbox Code Playgroud)