From 9c5dc0be63659663a0b4e192221ed5015f73c13a Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 12 Oct 2019 18:03:41 +0200 Subject: [PATCH] atomics: C11 -> C++20 --- src/atomics.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/atomics.md b/src/atomics.md index 4cd209a..7771943 100644 --- a/src/atomics.md +++ b/src/atomics.md @@ -1,20 +1,20 @@ # Atomics -Rust pretty blatantly just inherits C11's memory model for atomics. This is not +Rust pretty blatantly just inherits the memory model for atomics from C++20. This is not due to this model being particularly excellent or easy to understand. Indeed, this model is quite complex and known to have [several flaws][C11-busted]. Rather, it is a pragmatic concession to the fact that *everyone* is pretty bad at modeling atomics. At very least, we can benefit from existing tooling and -research around C. +research around the C/C++ memory model. Trying to fully explain the model in this book is fairly hopeless. It's defined in terms of madness-inducing causality graphs that require a full book to properly understand in a practical way. If you want all the nitty-gritty -details, you should check out [C's specification (Section 7.17)][C11-model]. +details, you should check out the [C++20 draft specification (Section 31)][C++-model]. Still, we'll try to cover the basics and some of the problems Rust developers face. -The C11 memory model is fundamentally about trying to bridge the gap between the +The C++ memory model is fundamentally about trying to bridge the gap between the semantics we want, the optimizations compilers want, and the inconsistent chaos our hardware wants. *We* would like to just write programs and have them do exactly what we said but, you know, fast. Wouldn't that be great? @@ -113,7 +113,7 @@ programming: # Data Accesses -The C11 memory model attempts to bridge the gap by allowing us to talk about the +The C++ memory model attempts to bridge the gap by allowing us to talk about the *causality* of our program. Generally, this is by establishing a *happens before* relationship between parts of the program and the threads that are running them. This gives the hardware and compiler room to optimize the program @@ -148,7 +148,7 @@ propagated to other threads. The set of orderings Rust exposes are: * Acquire * Relaxed -(Note: We explicitly do not expose the C11 *consume* ordering) +(Note: We explicitly do not expose the C++ *consume* ordering) TODO: negative reasoning vs positive reasoning? TODO: "can't forget to synchronize" @@ -252,4 +252,4 @@ relaxed operations can be cheaper on weakly-ordered platforms. [C11-busted]: http://plv.mpi-sws.org/c11comp/popl15.pdf -[C11-model]: http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899 +[C++-model]: http://eel.is/c++draft/atomics.order