编译器重新排序部分互斥
Compiler reordering section with mutual exclusion
由于 rust 将互斥量作为其数据的 container/owner 应用,并且不使用像 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();
})
Rust 实际上 uses the same memory model as C++20。所以 AFAIK 你可以用锁保护 code,这不是一个好主意(因为实际上没有什么可以阻止对共享资源的非同步访问,而且通常有一个你想要保护的),还有一点容易出错,因为您需要确保让互斥保护保持活动状态。
我真的不明白这里的重点:
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
完全没用,因为:你锁定了整个回调,所以你只是在进行线性迭代,除了非顺序迭代和大量开销。
由于 rust 将互斥量作为其数据的 container/owner 应用,并且不使用像 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();
})
Rust 实际上 uses the same memory model as C++20。所以 AFAIK 你可以用锁保护 code,这不是一个好主意(因为实际上没有什么可以阻止对共享资源的非同步访问,而且通常有一个你想要保护的),还有一点容易出错,因为您需要确保让互斥保护保持活动状态。
我真的不明白这里的重点:
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
完全没用,因为:你锁定了整个回调,所以你只是在进行线性迭代,除了非顺序迭代和大量开销。