|
1 | 1 | # Atomics
|
2 | 2 |
|
3 |
| -Rust pretty blatantly just inherits C11's memory model for atomics. This is not |
| 3 | +Rust pretty blatantly just inherits the memory model for atomics from C++20. This is not |
4 | 4 | due to this model being particularly excellent or easy to understand. Indeed,
|
5 | 5 | this model is quite complex and known to have [several flaws][C11-busted].
|
6 | 6 | Rather, it is a pragmatic concession to the fact that *everyone* is pretty bad
|
7 | 7 | at modeling atomics. At very least, we can benefit from existing tooling and
|
8 |
| -research around C. |
| 8 | +research around the C/C++ memory model. |
| 9 | +(You'll often see this model referred to as "C11" or "C/C++11". C and C++ share their |
| 10 | +memory model and those were the first versions but they have received some bugfixes |
| 11 | +since then.) |
9 | 12 |
|
10 | 13 | Trying to fully explain the model in this book is fairly hopeless. It's defined
|
11 | 14 | in terms of madness-inducing causality graphs that require a full book to
|
12 | 15 | properly understand in a practical way. If you want all the nitty-gritty
|
13 |
| -details, you should check out [C's specification (Section 7.17)][C11-model]. |
| 16 | +details, you should check out the [C++20 draft specification (Section 31)][C++-model]. |
14 | 17 | Still, we'll try to cover the basics and some of the problems Rust developers
|
15 | 18 | face.
|
16 | 19 |
|
17 |
| -The C11 memory model is fundamentally about trying to bridge the gap between the |
| 20 | +The C++ memory model is fundamentally about trying to bridge the gap between the |
18 | 21 | semantics we want, the optimizations compilers want, and the inconsistent chaos
|
19 | 22 | our hardware wants. *We* would like to just write programs and have them do
|
20 | 23 | exactly what we said but, you know, fast. Wouldn't that be great?
|
@@ -113,7 +116,7 @@ programming:
|
113 | 116 |
|
114 | 117 | # Data Accesses
|
115 | 118 |
|
116 |
| -The C11 memory model attempts to bridge the gap by allowing us to talk about the |
| 119 | +The C++ memory model attempts to bridge the gap by allowing us to talk about the |
117 | 120 | *causality* of our program. Generally, this is by establishing a *happens
|
118 | 121 | before* relationship between parts of the program and the threads that are
|
119 | 122 | running them. This gives the hardware and compiler room to optimize the program
|
@@ -148,7 +151,7 @@ propagated to other threads. The set of orderings Rust exposes are:
|
148 | 151 | * Acquire
|
149 | 152 | * Relaxed
|
150 | 153 |
|
151 |
| -(Note: We explicitly do not expose the C11 *consume* ordering) |
| 154 | +(Note: We explicitly do not expose the C++ *consume* ordering) |
152 | 155 |
|
153 | 156 | TODO: negative reasoning vs positive reasoning? TODO: "can't forget to
|
154 | 157 | synchronize"
|
@@ -252,4 +255,4 @@ relaxed operations can be cheaper on weakly-ordered platforms.
|
252 | 255 |
|
253 | 256 |
|
254 | 257 | [C11-busted]: http://plv.mpi-sws.org/c11comp/popl15.pdf
|
255 |
| -[C11-model]: http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899 |
| 258 | +[C++-model]: http://eel.is/c++draft/atomics.order |
0 commit comments