C++ memory model and race conditions on char arrays

I think Bjarne is wrong about this, or at least, he’s
simplifying things considerably. Most modern processors are
capable of writing a byte without reading a complete word first,
or rather, they behave “as if” this were the case. In
particular, if you have a char array[2];, and thread one only
accesses array[0] and thread two only accesses array[1]
(including when both threads are mutating the value), then you
do not need any additional synchronization; this is guaranteed
by the standard. If the hardware does not allow this directly,
the compiler will have to add the synchronization itself.

It’s very important to note the “as if”, above. Modern hardware
does access main memory by cache lines, not bytes. But it also
has provisions for modifying single bytes in a cache line, so
that when writing back, the processor core will not modify bytes
that have not been modified in its cache.

Leave a Comment