Есть ли средство С++ std::lock()
в Rust для предотвращения взаимоблокировки в коде следующим образом:
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
вызывается потоком-0 и bar
потоком-1, существует вероятность блокировки. Есть что-то, надеюсь, вариативно, потому что у меня может быть больше 2, чтобы помочь мне в этом или я все сам по себе проверял правильность порядка блокировки?
Из документация для std::lock
:
Заблокирует заданные объекты
Lockable
lock1
,lock2
,...
,lockn
, используя алгоритм избежания тупиковой ситуации, чтобы избежать тупиковой ситуации.