如何在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 --^
// ...
}
}