On 19. Nov 2006, at 02:23, jeanpierre@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 } end