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_Concurrency - Fatal编程技术网

如何在rust中创建复杂的并发数据结构

如何在rust中创建复杂的并发数据结构,rust,concurrency,Rust,Concurrency,我需要一个包含多个字段的结构,这些字段应该在并发上下文中可用 struct Foo { number: u32, collection: Vec<u32>, } structfoo{ 编号:互斥锁, 集合:互斥体, } impl-Foo{ 发布fn添加(如果较大)(&self,v:u32){ 让collection=self.collection.lock().unwrap(); 如果self.u更大(v){ 收集、推送(v); } } fn更大(&self)->b

我需要一个包含多个字段的结构,这些字段应该在并发上下文中可用

struct Foo {
    number: u32,
    collection: Vec<u32>,
}
structfoo{
编号:互斥锁,
集合:互斥体,
}
impl-Foo{
发布fn添加(如果较大)(&self,v:u32){
让collection=self.collection.lock().unwrap();
如果self.u更大(v){
收集、推送(v);
}
}
fn更大(&self)->bool{
让collection=self.collection.lock().unwrap();
//已被此线程锁定--^
// ...
}
}

中添加\u如果\u更大
为什么要提前锁定并执行双重锁定?不能只执行self.collection.lock().unwrap().push(v)即一次一个锁,因为我希望整个方法作为一个块执行,因为调用之间可能会发生更多逻辑。忘了提那件事了。我将更新问题。然后我建议从
中移除锁,使其更大,使其成为私有的。对于其他线程,有另一个包装器公共函数
check\u is\u biger
,该函数将具有锁,并且只调用
is\u biger
。所以没有双重锁定。只需让函数采用
&mut self
,然后去掉结构中的互斥体。我不明白为什么您必须在内部使用互斥体。@Aplet123是的,这是一个想法,但是在我需要
CondVar
的情况下呢?
struct Foo {
    lock: Mutex<()>,
    number: u32,
    collection: Vec<u32>,
}
struct Foo {
    number: Mutex<u32>,
    collection: Mutex<Vec<u32>>,
}

impl Foo {
    pub fn add_if_bigger(&self, v: u32) {
        let collection = self.collection.lock().unwrap();
        if self.is_bigger(v) {
            collection.push(v);
        }
    }

    fn is_bigger(&self) -> bool {
        let collection = self.collection.lock().unwrap();
        // already locked by this thread --^
        // ...
    }
}