Forum: Ruby local variables and threads

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
9528ea68a2efbf9093b1d41f7f269f36?d=identicon&s=25 Russell Fulton (Guest)
on 2006-01-25 04:05
Is there a way to ensure that a particular variable really is local to a
thread block?  I have a problem with a threaded program that would be
explained if one of the local variable was actually global.  I've
checked everything I can think of...

I miss my and local from perl which allowed me to explicitly control the
scope of variables.

Russell.
Fe9b2d0628c0943af374b2fe5b320a82?d=identicon&s=25 Eero Saynatkari (rue)
on 2006-01-25 04:11
Russell Fulton wrote:
>
> Is there a way to ensure that a particular variable really is local to a
> thread block?  I have a problem with a threaded program that would be
> explained if one of the local variable was actually global.  I've
> checked everything I can think of...
>
> I miss my and local from perl which allowed me to explicitly control the
> scope of variables.

Only variables prefixed with $ are global ($var and so on).
It is, however, certainly possible to have shared locals
if you have something like

  some_var

  t1 = Thread.new { ... }
  t2 = Thread.new { ... }

Any variables that you define inside the thread block will
be local to that thread, though.

> Russell.


E
5befe95e6648daec3dd5728cd36602d0?d=identicon&s=25 Robert Klemme (Guest)
on 2006-01-25 09:29
(Received via mailing list)
Russell Fulton wrote:
> Is there a way to ensure that a particular variable really is local
> to a thread block?  I have a problem with a threaded program that
> would be explained if one of the local variable was actually global.
> I've checked everything I can think of...
>
> I miss my and local from perl which allowed me to explicitly control
> the scope of variables.

A typical problem with threads can be nicely illustrated with this:

09:21:51 [~]: ruby -e 'th=[]
> for i in 0 .. 5
>   th << Thread.new do
>     sleep(rand(5))
>     puts i
>   end
> end
> th.each {|t| t.join}
> '
2
5
5
5
5
5
09:22:21 [~]:


Problem here is that all threads share the local var 'i'.  Solution:

09:22:21 [~]: ruby -e 'th=[]
> for i in 0 .. 5
>   th << Thread.new(i) do |x|
>     sleep(rand(5))
>     puts x
>   end
> end
> th.each {|t| t.join}'
0
1
5
4
2
3

I.e. provide value(s) as arguments to Thread.new and receive them as
block
parameter(s) with different name(s).

HTH

Kind regards

    robert
This topic is locked and can not be replied to.