Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Oct 2017 01:03:16 +0200
From:      Joerg Sonnenberger <joerg@bec.de>
To:        freebsd-hackers@freebsd.org
Subject:   Re: fprintf - threadsafe? - i.e. with process linked against '-pthread'?
Message-ID:  <20171011230316.GA21395@britannica.bec.de>
In-Reply-To: <20171011215417.GH95911@kib.kiev.ua>
References:  <03DA6274A199550235DC7351@[10.12.30.106]> <20171011213452.GB32399@britannica.bec.de> <20171011215417.GH95911@kib.kiev.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Oct 12, 2017 at 12:54:17AM +0300, Konstantin Belousov wrote:
> 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().

That why I said "two separate FILE instances" :) The locking happens in
the FILE, not on the file descriptor.

Joerg



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20171011230316.GA21395>