3 ms·
Does Rust provide support for low level synchronisation related operations such as memory fences? If so is there any way relying on these can break data race fr
by anonymousDan 4y ago
Does Rust provide support for low level synchronisation related operations such as memory fences? If so is there any way relying on these can break data race freedom (which as I understand Rust guarantees)?
- masklinn 4y ago> If so is there any way relying on these can break data race freedom (which as I understand Rust guarantees)? It’s not clear what your question is. You can use unsafe to write unsound code which suffers from data races. If you use safe Rust, then you should not suffer from data races (and fences only add constraints, so they can’t add data races, they’re tools to avoid those), although bugs are always possible and sometimes purportedly safe stdlib APIs are found to be unsound (that’s one of the few things for which the rust project allows breaking backwards compatibility, though even that depends on the blast radius e.g. std::mem::uninitialized is still there, just deprecated, even though there’s almost no way to use it soundly).
- kaba0 4y agoBesides other’s answers, while data races are not possible in safe rust, other race conditions can happen (and not even the actor model is immune to these).
- shinazueli 4y agoIt has Atomics that use the same memory constraint model (Relaxed, SeqCst, etc), if that’s what you meant. You can indeed create data races with them, but only in combination with unsafe code. https://doc.rust-lang.org/nomicon/races.html https://doc.rust-lang.org/nomicon/races.html
- anonymousDan 4y agoI meant inserting barriers (read fence/write fence etc) explicitly. Thanks for the link, very interesting.
- jamesmunns 4y agoYep, we have `fence` for runtime+compile time barriers, and `compiler_fence` for compile time barriers. They take the same Ordering enum as atomics.