fprintf - threadsafe? - i.e. with process linked against '-pthread'?

Konstantin Belousov kostikbel at gmail.com
Wed Oct 11 21:54:24 UTC 2017


On Wed, Oct 11, 2017 at 11:34:52PM +0200, Joerg Sonnenberger wrote:
> On Wed, Oct 11, 2017 at 10:13:35AM +0100, Karl Pielorz wrote:
> > Presumably (and from what I can see) fprintf is 'thread safe'? - And it also
> > appears multiple threads could write to a single file using it (i.e. it
> > provides for atomic writes so lines won't intermingle - the lines written
> > don't seem to intermingle).
> 
> stdio does not provide atomic IO. If you have two file handles or even
> just two separate FILE instances sharing the same file handle and two
> threads or processes are writing to them concurrently, buffering will
> result in seemingly random interwoven output. Even using non-buffered IO
> can trigger the same behavior as there is internal blocking going on.
> Try a printf that created i.e. 16K output or so in one way, it should
> increase the chance of seeing this a lot.

Indeed stdio does not provide atomic IO, but it is thread-safe. That is,
each isolated stdio operation, except the ones with explicit _unlocked
suffix, are required to take an exclusive ownership on the FILE for the
duration of the operation. See the description of flockfile().


More information about the freebsd-hackers mailing list