[TxMt] errant rubymate output when dealing with threads

Allan Odgaard throw-away-1 at macromates.com
Sun Nov 19 02:55:06 UTC 2006

On 19. Nov 2006, at 02:23, jeanpierre at gmail.com wrote:

> i am seeing some strange rubymate output when working with threads -
> at times text is not printed on separate lines (when using puts rather
> than print) and at others, the text is not printed at all. any
> suggestions to resolve the rubymate behavior or pointers to where i
> could?

When you do Thread.new there is no guarantee that the code in your  
thread is executed *before* the code after the thread block.

So in your second example, it doesn’t get to run any of the thread  
code, before it reaches the end of your program. Try e.g. put ‘sleep  
1’ before Thread.kill, and you will get output.

Likewise, there is no guarantee that there won’t be a thread schedule  
basically anytime, in the case of puts, the puts call itself is not  
atomic, it writes first the string, then the newline. The reason why  
you see different behavior from RubyMate is that it makes STDOUT non- 
buffered, thus slower, and likely that is why you do see a thread  
switch before it writes the newline, and you don’t see it normally.

If you want to enforce a certain order, you need to introduce locks  
(see Mutex).

For example try to add this to the top of your first example, to make  
puts atomic:

     require "thread"

     $mutex = Mutex.new
     def puts(str)
       $mutex.synchronize { $stdout.puts str }

More information about the textmate mailing list