首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在防止死锁的同时,是否有办法锁定锈蚀中的多个互斥体?

在防止死锁的同时,是否有办法锁定锈蚀中的多个互斥体?
EN

Stack Overflow用户
提问于 2016-09-08 14:01:59
回答 2查看 2.1K关注 0票数 15

在Rust中是否有类似于C++ std::lock()的工具来防止代码中的死锁:

代码语言:javascript
复制
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对象lock1lock2...lockn以避免死锁。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-10 17:24:27

No,Rust没有一个与C++的std::lock等价的函数。

基于这一事实,它似乎没有在文档和谷歌提供任何有用的东西,我对这个断言很有信心。

为什么不行?好吧,如果我能发表一点评论的话,std::lock并不像你所希望的那样广泛有用。死锁的避免是非常重要的,每种算法都有可能导致性能不佳甚至生动活泼的情况。没有一刀切的避免死锁算法(参见std::lock()定义不明确,不可实现,还是无用?)在标准库中放置避免死锁的lock函数,这表明它是一个很好的默认选择,并且可能鼓励它的使用,而不考虑它的实现。大多数现实生活中的应用程序可能会使用一种更简单(且不那么通用)的算法。

有一些板条箱可以通过其他方式避免死锁。例如,追踪-互斥提供了锁类型,这些类型在运行时创建依赖关系图,如果依赖关系图包含循环,则会出现恐慌而不是死锁。地段有一个实验性的deadlock_detection特性(但我不确定它是如何工作的)。奇怪的是,我没有找到任何一个板条箱,它们提供的C++ std::sort相当于退避。

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

公平地说,您可以为Rust确实具有的其他功能提出相同的论点,如[T]::sort。但是,在许多应用中,排序不是瓶颈,任何合理的快速算法都是足够好的。避免死锁在一般情况下不太必要,出现时更有可能对性能敏感。

票数 5
EN

Stack Overflow用户

发布于 2016-09-08 14:47:42

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

代码语言:javascript
复制
let tuple_mutex = Arc::new(Mutex::new((A, B)));
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39393008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档