diff --git a/source/threads.tex b/source/threads.tex index b3a041cf6f..6c6ccf472d 100644 --- a/source/threads.tex +++ b/source/threads.tex @@ -3011,6 +3011,30 @@ \end{codeblock} \end{note} +\pnum +\begin{note} +An implementation that +translates to instruction sequences for a physical machine and +treats non-volatile atomic accesses as though they were volatile +does not produce out-of-thin-air values for a program free of undefined behavior. +An implementation that +performs only thread-at-a-time analysis in support of optimizations +that omit and merge non-volatile atomic accesses to the same object and +reorder non-volatile atomic accesses to different objects (when permitted by the as-if rule) and +otherwise treats non-volatile atomic accesses as though they were volatile +does not produce out-of-thin-air values for a program free of undefined behavior. +The possibility of out-of-thin-air values remains +for implementations not meeting these restrictions. +\end{note} + +\pnum +\begin{note} +Unlike abstract machines, +physical machines are subject to instruction-execution and information-transfer latencies. +Physical machines carefully manage any speculative execution +so as to avoid generating out-of-thin-air values at the hardware level. +\end{note} + \pnum Atomic read-modify-write operations shall always read the last value (in the modification order) written before the write associated with