In general I assume that streams are not synchronized, it is up to the user to do appropriate locking. However, do things like cout get special treatment in the standard library?
That is, if multiple threads are writing to cout can they corrupt the cout object? I understand that even if synchronized you’d still get randomly interleaved output, but is that interleaving guaranteed. That is, is it safe to use cout from multiple threads?
Is this vendor dependent? What does gcc do?
Important: Please provide some kind of reference for your answer if you say “yes” since I need some kind of proof of this.
My concern is also not about the underlying system calls, those are fine, but the streams add a layer of buffering on top.
The C++03 standard does not say anything about it. When you have no guarantees about the thread-safety of something, you should treat it as not thread-safe.
Of particular interest here is the fact that
coutis buffered. Even if the calls towrite(or whatever it is that accomplishes that effect in that particular implementation) are guaranteed to be mutually exclusive, the buffer might be shared by the different threads. This will quickly lead to corruption of the internal state of the stream.And even if access to the buffer is guaranteed to be thread-safe, what do you think will happen in this code?
You probably want each line here to act in mutual exclusion. But how can an implementation guarantee that?
In C++11, we do have some guarantees. The FDIS says the following in §27.4.1 [iostream.objects.overview]:
So, you won’t get corrupted streams, but you still need to synchronize them manually if you don’t want the output to be garbage.