gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:36:19 24 4
gpt4 key购买 nike

我正在尝试学习如何像在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com