Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何以锁定结构的方式锁定生锈的结构?_Rust_Locking_Mutex - Fatal编程技术网

Rust 如何以锁定结构的方式锁定生锈的结构?

Rust 如何以锁定结构的方式锁定生锈的结构?,rust,locking,mutex,Rust,Locking,Mutex,我正在努力学习如何用锁的工作方式锁锈。使用Go,我可以做以下事情: 类型信息结构{ sync.RWMutex 高度uint64 验证布尔 } 如果我有一些作用于信息的函数/方法,我可以这样做: func i*信息DoStuffmyType数据错误{ i、 锁 //做我的事 } 看起来我需要的是sync.RWMutex,所以这是我尝试过的: pub struct Info { pub lock: sync.RWMutex, pub height: u64, pub veri

我正在努力学习如何用锁的工作方式锁锈。使用Go,我可以做以下事情:

类型信息结构{ sync.RWMutex 高度uint64 验证布尔 } 如果我有一些作用于信息的函数/方法,我可以这样做:

func i*信息DoStuffmyType数据错误{ i、 锁 //做我的事 } 看起来我需要的是sync.RWMutex,所以这是我尝试过的:

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

这是正确的方法吗?我该如何从这里开始呢?

不要走老路,要走老路。和是泛型;您将要锁定的数据放入其中。稍后,您将通过锁防护装置访问数据。当锁护罩超出范围时,锁释放:

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;
}
另见:


这个问题没有显示出研究的努力。有例子的要点。在同一个模块中,还有一些示例。@Shepmaster我不明白这些示例与结构的关系,抱歉。