writefx and threads
kris
foo at bar.com
Thu Jan 25 17:13:55 PST 2007
Matthias Walter wrote:
> Jari-Matti Mäkelä Wrote:
>
>
>>Matthias Walter wrote:
>>
>>>Hello,
>>>
>>>I've written a simple threaded application, where 30 threads only print some messages. If I use writefln() for this, it looks like this:
>>>
>>>...
>>>Thread started...
>>>Thread finished.
>>>TTThread started...
>>>Thread finished.
>>>hread started...
>>>Thread finished.
>>>hread started...
>>>Thread finished.
>>>...
>>>
>>>If I use standard printf(), this doesn't happen, it looks like
>>>
>>>...
>>>Thread started...
>>>Thread finished...
>>>Thread started...
>>>Thread finished...
>>>...
>>>
>>>Looking at std/stdio.d, there's a "__fp_lock(fp);" call in writefx(), but it seems to me,
>>>this doesn't help to sync the output routines. Or are output routines not
>>>supposed to be synced by default? If yes, this seems to be okay from
>>
>>some point of view,
>>
>>>but is somehow irritating!
>>
>>D uses buffered I/O. You may need to explicitly call flush() to finish
>>all output before sending new. One other thing, without thread
>>synchronization there is no guarantee that the threads are run in a
>>specific order.
>>
>>BTW, please use this newsgroup for reporting bugs, there's
>>digitalmars.D.learn for asking questions.
>>
>
>
> of course, order of execution cannot be determined in advance, but I added fflush(stdout); right after my writef() call. Nothing changed so far.
>
> How do I sync the threads that output of lines doesn't get interrupted? Of course,
> one possibility is to put a mutex around the FILE object, checking it before write,
> but isn't it normally the case that it already has a mutex to protect against
> concurrent writes? as my example shows, printf from glibc does this.
>
> Matthias Walter
It's often reasonable for a library to avoid using mutex, since they can
affect performance quite notably. For example, Tango doesn't have a
mutex in Stdout, but instead support the following idiom:
sychnronized (Stdout)
Stdout ( ..... );
Which amounts to what your after, I think?
Tango also has pretty good 'logging' facilities [1], which are atomic in
nature, and also expose the thread-id. It's based on the Log4J model.
[1] where logging is a redirectable, runtime configurable, network
capable mechanism for tracing application execution & behaviour.
More information about the Digitalmars-d-learn
mailing list