On Sat, Apr 24, 2010 at 9:44 AM, Tobias C. Rittweiler tcr@freebits.de wrote:
There's a trick against the mangling. Use
(fresh-line) (write-line (format nil <fmt-ctrl> . <fmt-args>))
That seems to have a much smaller but still non-vanishing interaction cross section. It's much better than just a plain (format t ...), but it still occasionally mangles.
(defun print-stuff () #'(lambda () (dotimes (i 1000) (fresh-line) (write-line (format nil "i = ~A" i) ))))
(dotimes (i 10) (threads:make-thread (print-stuff)))
Produces a few lines like these:
i = 831 i = 826i = 832 i = 833 i = 828
In my actual code I use a sledge hammer and
(defvar *output-lock* (cons nil nil))
then I wrap anything that writes a message to the screen with
(with-thread-lock (*output-lock*) (format ...))
Of course, combining the two approaches and wrapping the (write-line ...) would minimize thread contention, but about the only thing I use this for is debug output ...
Thanks,
david