【发布时间】:2021-10-02 00:02:10
【问题描述】:
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();
}
如果foo 被thread-0 调用,bar 被thread-1 调用,则有可能出现死锁。有什么东西可以帮助我解决这个问题,希望是可变的,因为我可以有超过 2 个,还是我自己验证锁定顺序的正确性?
来自the documentation for std::lock:
使用死锁避免算法锁定给定的
Lockable对象lock1、lock2、...、lockn以避免死锁。
【问题讨论】:
-
诚然,我不知道
std::lock是如何工作的,但是(除非你按照 mmstick 的回答将数据集中在一起并立即锁定/解锁它)我不知道你怎么能保证没有死锁。当然,您可以编写一个宏来以正确的顺序执行它们 - 但是您只是将检查您是否始终以正确的顺序锁定它们的问题变成了几乎不简单的问题检查您是否始终使用宏并且从不直接调用 .lock()。对吗?