On Sun, Dec 30, 2012 at 2:09 PM, Matthew Kerwin <[email protected]> wrote:
> On 30 December 2012 22:43, Matthew Kerwin <[email protected]> wrote:
>>
>> On 30 December 2012 21:21, Robert Klemme <[email protected]>
>> wrote:
>>>
>>> On Sun, Dec 30, 2012 at 2:38 AM, Grant Schoep <[email protected]>
>>> wrote:

>>> Here's another way to demonstrate the effect:
>>>
>>> $ ruby -e 'for i in 0..4; Thread.new(i) {|n| sleep 1;p [i,n]} end;sleep
>>> 2'
>>> [4, 3]
>>> [4, 4]
>>> [4, 2]
>>> [4, 1]
>>> [4, 0]

>> Or is there a potential race condition caused by possibly deferred
>> execution of the block, which is avoided by performing the "renaming"
>> assignment in the parent thread?  I'm trying to think of an example, but am
>> having trouble.
>
> Thought of one (sorry for replying to myself):
>
>     a = 1
>     loop do
>       Thread.new { b=a; p b }
>       a += 1
>     end
>
> .. where `a += 1` is likely to run before `b=a`; as opposed to ..
>
>     a = 1
>     loop do
>       Thread.new(a) { |b| p b }
>       a += 1
>     end
>
> .. where passing the value of _a_ to Thread#new is guaranteed to happen
> before `a += 1`, so _b_ will always have the right value.

This race condition is what my example posted earlier demonstrates.
You can change it a bit to make it more similar to your a+=1 example:

$ ruby -e 'a=0; 4.times {Thread.new(a) {|n| sleep 1;p [a,n]}; a+=1}; sleep 2'
[4, 1]
[4, 0]
[4, 2]
[4, 3]

Kind regards

robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

-- You received this message because you are subscribed to the Google Groups 
ruby-talk-google group. To post to this group, send email to 
[email protected]. To unsubscribe from this group, send email 
to [email protected]. For more options, visit this 
group at https://groups.google.com/d/forum/ruby-talk-google?hl=en

Reply via email to