std::mutex in C++ versus std::sync::Mutex in rust



我一直发现std::mutex C++是手动的,容易出错。我需要手动将某个 std::mutex 归因于特定变量,我需要记住在访问这些特定变量之前始终锁定 std::mutex。

然后我开始学习 Rust,我看到在 Rust 中,std::sync::Mutex 是对象的包装器,类似于 C++ 中的 std::tuple 是对象的包装器。 std::sync::mutex 可以被锁定,然后它返回一个对象来访问成员。只要该句柄对象存在,std::sync::mutex 就会保持锁定状态,并在析构函数中解锁(或者其他东西,不确定它在 Rust 中是如何工作的)。我的第一印象是,这是将互斥锁与它应该保护的数据联系起来的更好方法!

所以我的想法是:如何将此功能C++? 我知道C++是创建自定义功能(例如 boost)的强大选择,所以这里有一个问题:

Rust 做事的方式有问题吗?(僵局问题等)

有没有理由让 Rust 可以侥幸逃脱它所做的事情,C++无法匹敌?(防止死锁,借用检查器保持互斥锁锁定等)

是否有现有的 Rust 风格的 std::mutex 包装器实现C++?

Rust 的实现坏了吗?(因为死锁什么的)

或者,我注定要失败吗?C++如此根本性地崩溃了吗?

Rust 做事的方式有问题吗?(僵局问题等)

MutexGuard可以向受互斥锁保护的值发出可变/独占引用(&mut)。为了保证MutexGuard对受保护的值具有独占访问权限,互斥锁不能重入。一个可重入互斥锁可以发出多个MutexGuard,每个互斥锁都可以发出对相同值的可变引用,这违反了不能同时有多个活动的可变引用到同一内存位置的规则。

有没有理由让 Rust 可以侥幸逃脱它所做的事情,C++无法比拟?(防止死锁,借用检查器保持互斥锁锁定等)

MutexGuard分发的参考文献具有与MutexGuard相关的生命周期。这意味着当MutexGuard被删除(即,锁被释放)时,不能再使用对受保护值的引用

如果要在 C++ 中实现相同的模式,则可以阻止用户访问受保护的值,直到锁定被获取,但无法阻止他们在释放锁后保留指向受保护值的指针或引用,除非锁保护从一开始就从未分发指向受保护值的指针或引用。

Rust 的实现坏了吗?(因为死锁什么的)

Rust 的互斥锁不能防止死锁。线程 1 锁定 A 然后 B 和线程 2 锁定 B 然后 A 的经典案例很可能导致 Rust 死锁。我不会因此而认为 Rust 被破坏了,因为大多数其他语言都有同样的弱点。

在C++中,您可以使用std::scoped_lock来获得自动解锁。

它与 std::mutex 解耦,因为存在不同的互斥类型(递归、非递归、基于线程、旋转锁等)。理论上,如果互斥锁类型以与类型无关的方式编写,则可以替换互斥类型而不会影响代码。

在 Rust (1.58) 中,不同类型的互斥体没有通用接口,返回的防护类型在理论上也可能不同(尽管在实践中非常相似)。

若要在C++中获取数据封装方面,可能需要实现自定义智能指针。有一些库可以做到这一点,例如 cpp-mutex-guard。

除了中毒的想法之外,Rust 实现中没有任何魔力,因此可以在C++中实现。

最新更新