Rust不允许使用这种代码,因为它不安全:
fn main() {
let mut i = 42;
let ref_to_i_1 = unsafe { &mut *(&mut i as *mut i32) };
let ref_to_i_2 = unsafe { &mut *(&mut i as *mut i32) };
*ref_to_i_1 = 1;
*ref_to_i_2 = 2;
}
Run Code Online (Sandbox Code Playgroud)
如何通过对同一事物的多个可变引用来做一些不好的事情(例如,分段错误,未定义的行为等)?
我能看到的唯一可能的问题来自数据的生命周期.在这里,如果i是活着的,每个可变引用都应该没问题.
我可以看到引入线程时可能会出现什么问题,但是为什么即使我在一个线程中执行所有操作也会阻止它?
我知道你不允许在Rust中同时创建两个对象的可变引用.我不完全理解为什么以下代码有效:
fn main() {
let mut string = String::from("test");
let mutable_reference: &mut String = &mut string;
mutable_reference.push_str(" test");
// as I understand it, this creates a new mutable reference (2nd?)
test(&mut *mutable_reference);
println!("{}", mutable_reference);
}
fn test(s: &mut String) {
s.push_str(" test");
}
Run Code Online (Sandbox Code Playgroud) 该锈书大约有多个读者和多个可变对象引用的数据竞争情况,可能会导致问题进行会谈。
例如,这段代码:
fn main() {
let mut x = 1;
let r1 = &mut x;
*r1 = 2;
let r2 = &mut x;
*r2 = 3;
println!("{}", r1);
println!("{}", r2);
}
Run Code Online (Sandbox Code Playgroud)
将被 Rust 编译器拒绝,因为r1和r2作用域交织在一起。
但是这里有什么问题呢?我的意思是,这只是一个线程,没有“同时读取和写入”,因此所有这些语句都应严格按顺序执行并给出确定性的可重现结果。