0

由于 rust 将互斥锁应用为其数据的容器/所有者并且不使用像 C++ 这样的外部保护,我想知道 rust 编译器是否可能在以下伪代码中重新排序循环的内部部分(并且这样做, 使其无效..) 如果是这样,我该如何防止它?

let mut some_type = SomeType::new();
let mut my_lock = MyLock::new();
(0..n).par_iter().for_each(|| {
     my_lock.lock();
     do_some_stuff_with(&mut some_type);
     my_lock.unlock();
}) 
4

1 回答 1

1

Rust 实际上使用与 C++20 相同的内存模型。所以AFAIK你可以用锁来保护代码,这不是一个好主意(因为实际上没有什么可以阻止对共享资源的非同步访问,而且通常有一个你想要保护的),而且还容易出错,因为你需要确保你保持互斥锁活着。

我真的不明白这里的重点:

let mut my_lock = Mutex::new(SomeType::new());
(0..n).par_iter().for_each(|| {
     let mut some_type = my_lock.lock().unwrap();
     do_some_stuff_with(&mut some_type);
})

当然这par_iter是完全没用的,因为:你锁定了整个回调,所以你只是在做一个线性迭代,除了非顺序的并且有大量的开销。

于 2021-05-15T16:02:32.030 回答