我正在try 使用parking_lot来编写一个代码块,其中每当我没有对RwLock的引用时,我就使用它的属性:

let property = if i_already_have_the_reference {
  simple_mut_reference_to_property
} else {
  my_lock.write().map(|v| v.property)
};

但是,这不起作用,因为第一个分支是简单的&mut MyReference类型,而第二个分支是MappedRwLockWriteGuard类型.

如果我用&mut取消对MappedRwLockWriteGuard的引用,编译器将在Else分支的末尾删除临时变量.

所以,我能想到的唯一解决方案是从simple_mut_reference_to_property创建一个虚拟的MappedRwLockWriteGuard,这实际上不会解锁Drop上的锁.

你对解决这个问题有什么建议?

如果不可能,是否有允许手动锁定/解锁C-Way的API?

附言:我之所以用parking_lot而不是std::sync是因为我认为我可以用.map解决这个问题

推荐答案

在这种情况下,一种有用的模式是拥有一个有时初始化、有时不初始化的变量.您可以持有该变量中的锁:

let mut write_guard;
let property = if i_already_have_the_reference {
    simple_mut_reference_to_property
} else {
    write_guard = my_lock.write();
    &mut write_guard.property
};

Rust相关问答推荐

在一个tauri协议处理程序中调用一个rectuc函数的推荐技术是什么?

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

在泛型 struct 的字段声明中访问关联的Conant

rust 蚀生命周期 行为

S,一般性状和联想型性状有什么不同?

了解Rust';s特征对象和不同函数签名中的生存期注释

为什么编译器看不到这个 `From` impl?

Rust 中的内存管理

为什么我的trait 对象类型不匹配?

在 Bevy 项目中为 TextureAtlas 精灵实施 NearestNeighbor 的正确方法是什么?

Some(v) 和 Some(&v) 有什么区别?

在 Rust 中,我如何处理请求 javascript 的页面?

SDL2 没有在终端键上触发?

试图理解 Rust 中的可变闭包

我如何将 google_gmail1::Gmail> 传递给线程生成?

预期类型参数,发现不透明类型

在 Rust 中为泛型 struct 编写一次特征绑定

使用泛型作为关联类型,没有幻像数据

使用 rust-sqlx/tokio 时如何取消长时间运行的查询

如何在 Rust 中构建一个 str