gpt4 book ai didi

struct - 在Rust中传递对结构的引用

转载 作者:行者123 更新时间:2023-12-03 11:42:30 25 4
gpt4 key购买 nike

我的问题基本上是在程序中,我需要将对s结构的引用传递到多个位置,包括一个新线程。例如,在C语言中,我可以将其声明为全局结构并以这种方式使用它。
我该怎么办?
我还需要使用包裹在RefCell中的Rc来获取某些代码(我的上一个问题)。

fn a_thread(s: &SomeStruct) {

//... code using s reference ... //

}

struct SomeStruct {
val: bool,
}

fn main() {
let mut s = SomeStruct { val: true };

let s_rc = Rc::new(RefCell::new(s));
thread::spawn(move || a_thread(&s)); // <= error: use of moved value 's'


//... code using the s_rc ... //


}



最佳答案

如果一个线程修改了数据,而另一个线程读取了该数据,则必须进行同步,否则将导致数据争用。 Safe Rust可以通过静态分析来防止数据争用,因此当基础值可以由另一个线程修改时,它不允许您获取&SomeStruct
您可以使用互斥锁代替RefCell,并使用Arc代替Rc:

fn a_thread(s: Arc<Mutex<SomeStruct>) {
// when you need data from s:
{
let s = s.lock().unwrap();
// here you can read from s, or even obtain a `&SomeStruct`
// but as long as you hold on to it, the main thread will be
// blocked in its attempts to modify s
}
}

fn main() {
// create s on the heap
let s = Arc::new(Mutex::new(SomeStruct { val: true }));

// cloning the Arc creates another reference to the value
let s2 = Arc::clone(&s);
thread::spawn(move || a_thread(s2));

//... code using s ... //
{
let s = s.lock().unwrap();
// here you can modify s, but reading will be blocked
}
}

关于struct - 在Rust中传递对结构的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65059364/

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