rust - 如何像在 Go 中锁定结构一样锁定 Rust 结构?

标签 rust locking mutex

我正在尝试学习如何像在 Go 中那样在 Rust 中使用锁。使用 Go 我可以做类似的事情:

type Info struct {
    sync.RWMutex
    height    uint64 
    verify bool
}

如果我有一些作用于信息的函数/方法,我可以这样做:

func (i *Info) DoStuff(myType Data) error {
    i.Lock()
    //do my stuff
}

看来我需要的是sync.RWMutex,所以这是我尝试过的:

pub struct Info {
    pub lock: sync.RWMutex,
    pub height: u64,
    pub verify: bool,
}

这是正确的做法吗?我将如何从这里开始?

最佳答案

不要用 Go 的方式,用 Rust 的方式。 MutexRwLock是泛型;您将要锁定的数据放在它们的内部。稍后,您可以通过lock guard 访问数据。当锁守卫超出范围时,锁被释放:

use std::sync::RwLock;

#[derive(Debug, Default)]
struct Info {
    data: RwLock<InfoData>,
}

#[derive(Debug, Default)]
struct InfoData {
    height: u64,
    verify: bool,
}

fn main() {
    let info = Info::default();
    let mut data = info.data.write().expect("Lock is poisoned");
    data.height += 42;
}

Go 的解决方案不是最优的,因为没有任何东西强制您实际使用锁;您可能会忘记获取锁并访问仅应在锁定时使用的数据。

如果您必须锁定不是数据的东西,您可以只锁定空元组:

use std::sync::RwLock;

#[derive(Debug, Default)]
struct Info {
    lock: RwLock<()>,
    height: u64,
    verify: bool,
}

fn main() {
    let mut info = Info::default();
    let _lock = info.lock.write().expect("Lock is poisoned");
    info.height += 42;
}

另见:

关于rust - 如何像在 Go 中锁定结构一样锁定 Rust 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57256035/

相关文章:

c++ - 编译为 wasm 的 C++ 和 Rust 程序能否以某种方式互操作?

rust - 在使用 wasm-bindgen 时,如何解决无法导出具有生命周期的函数的问题?

python - Tkinter 中的程序窗口锁定

c++ - 在多线程应用程序中,如果函数不修改/读取数据或修改/读取临时数据,2个以上线程可以访问同一个函数吗?

rust - 不能借用 `*request` 作为可变的,因为它也被借用为不可变的

rust - 如何从特征对象中获取对具体类型的引用?

python - 我怎样才能确保innodb线程安全

java - 该等待/通知代码性能异常

C 对如何初始化和实现 pthread 互斥体和条件变量感到困惑

.net - 转移.NET互斥锁的所有权