Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 是否有一种设施可以在防止死锁的同时锁定多个互斥锁? 有一个C++ STD::()(代码)>像在锈中的设施,以防止这样的代码中死锁: 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(); } 类型Type0=Arc; 类型1=弧; fn-foo(a:Type0,b:Type1){ 让a_guard=a.lock().unwrap(); 让b_guard=b.lock().unwrap(); } fn条(a:Type0,b:Type1){ 让b_guard=b.lock().unwrap(); 让a_guard=a.lock().unwrap(); }_Rust_Mutex - Fatal编程技术网

Rust 是否有一种设施可以在防止死锁的同时锁定多个互斥锁? 有一个C++ STD::()(代码)>像在锈中的设施,以防止这样的代码中死锁: 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(); } 类型Type0=Arc; 类型1=弧; fn-foo(a:Type0,b:Type1){ 让a_guard=a.lock().unwrap(); 让b_guard=b.lock().unwrap(); } fn条(a:Type0,b:Type1){ 让b_guard=b.lock().unwrap(); 让a_guard=a.lock().unwrap(); }

Rust 是否有一种设施可以在防止死锁的同时锁定多个互斥锁? 有一个C++ STD::()(代码)>像在锈中的设施,以防止这样的代码中死锁: 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(); } 类型Type0=Arc; 类型1=弧; fn-foo(a:Type0,b:Type1){ 让a_guard=a.lock().unwrap(); 让b_guard=b.lock().unwrap(); } fn条(a:Type0,b:Type1){ 让b_guard=b.lock().unwrap(); 让a_guard=a.lock().unwrap(); },rust,mutex,Rust,Mutex,如果线程0调用foo,线程1调用bar,则有可能出现死锁。是否有什么东西,希望是可变的,因为我可以有超过2个,来帮助我完成这项工作,还是我自己来验证锁定顺序的正确性 发件人: 使用死锁避免算法锁定给定的可锁定对象,以避免死锁 如果Mutex是包含值的元组,那么很容易解决这个问题,因此锁定元组会同时锁定两个值 let tuple_mutex = Arc::new(Mutex::new((A, B))); 否,Rust没有(或还没有)与C++的std::lock等效的函数 基于这样一个事实,即它似

如果线程0调用
foo
,线程1调用
bar
,则有可能出现死锁。是否有什么东西,希望是可变的,因为我可以有超过2个,来帮助我完成这项工作,还是我自己来验证锁定顺序的正确性

发件人:

使用死锁避免算法锁定给定的可锁定对象,以避免死锁


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

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

,Rust没有(或还没有)与C++的
std::lock
等效的函数

基于这样一个事实,即它似乎并不存在,谷歌搜索也没有带来任何有用的东西,我对这一断言相当有信心

为什么不呢?好吧,如果我可以编辑一下,拥有
std::lock
并不是一个好主意——避免死锁是非常重要的,每种算法都会有可能导致性能低下甚至活锁的死角情况。没有一刀切的死锁避免算法

(您可以对Rust确实具有的其他函数使用相同的参数,如
Vec::sort
,但我认为“排序”在性能不重要的许多应用程序中都需要,任何合理的排序算法的性能都足以满足超过75%的应用程序。只有在编写需要良好性能的代码时,才需要避免死锁。)

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


无论如何,没有什么能阻止你编写自己的“后退”算法来解决这个问题;它只是不是标准库的一部分。

这一点很好,但可能希望保留独立值的灵活性。我们可以看到tuple只是一个单一类型,因此基本上是对单一类型进行静音。不过,我要寻找的是不同互斥体的解决方案。对于粒度,您可能不希望总是将它们合并到一个元组/类型中—这样您就牺牲了它们可以独立运行的情况,而这在我的代码中非常常见。这两者之间真的有区别,这真的允许我们同时锁定互斥,还是实际上它们是一个接一个地锁定的?如果是,互斥锁的解锁顺序是什么?@SimonElliott此解决方案中只有一个
互斥锁
;它用于锁定复合值。这些值同时被锁定,因为它们由同一个互斥体控制。诚然,我不知道
std::lock
是如何工作的,但是(除非你遵循mmstick的答案,将数据集中在一起并立即锁定/解锁),我不知道你怎么能保证没有死锁。当然,您可以编写一个宏来按正确的顺序执行这些操作——但是,您只是将检查是否始终按正确的顺序锁定它们的问题变为检查始终使用该宏且从不直接调用.lock()的简单问题。对吗?