具有互斥的编译器重新排序部分

问题描述

由于 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();
}) 

解决方法

实际上生锈了 uses the same memory model as 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 完全没用,因为:您正在锁定整个回调,所以您只是在进行线性迭代,除了非顺序和大量开销。