| > reads are always unsafe when there is a possibility of writes. That is correct for any reads that could race against a write. Writes must be synchronized with all other operations. But reads may proceed in parallel with other reads without synchronization. For example, if you have an object that is written in the thread where it is constructed, and only released to other threads once the mutation is complete, then you do not need to synchronize readers. Because the nature of the data flow ensures that none of the writes can race with the reads. > So to me this just reads as, "the caller has to manage all the thread safety for all the accesses" Not all accesses. Just the ones where a writer may race with another write or a read. > Or is there an example of some c++ that is not even "thread-compatible" once the caller has accepted the burden of synchronization? Thread-unsafe types do not even allow two reads to be unsynchronized. |