in reply to Scope of thread variable

Unless a variable is shared, each thread will have it's own copy. Full stop.

But...if you assign to an our (global) var prior to spawing a thread that uses that our var, the contents of that our var may no longer be usable.


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
"I'd rather go naked than blow up my ass"

Replies are listed 'Best First'.
Re^2: Scope of thread variable
by mr_p (Scribe) on Apr 07, 2010 at 18:58 UTC
    So, I should not be worried about clashing of variables with threads?

    you said contents may not be used but threads will get their own "our" variable and threads can modify it, right?

      So, I should not be worried about clashing of variables with threads?

      you said contents may not be used but threads will get their own "our" variable and threads can modify it, right?

      I'm gonna await the sucker punch, but ostensibly: No, you shouldn't worry. Yes, threads can safely modify our variables:

      A new thread will inherit a copy of any pre-existing global variable, but both it, and any other threads, may safely modify their copies of that variable without conflict. This may convince you.

      #! perl -slw use strict; use threads; my $tid = threads->tid; our $fred = 12345; print "$tid : $fred"; my $t = threads->create( sub{ my $tid = threads->tid; our $fred; print "$tid : $fred"; $fred = 54321; print "$tid : $fred"; } )->join; print "$tid : $fred"; $fred = 'fred'; print "$tid : $fred"; __END__ C:\test>junk 0 : 12345 1 : 12345 1 : 54321 0 : 12345 0 : fred

      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Thanks for your help again.

        I just wanted to confirm before I put anything into production.

        Can you tell me how to use eval on this code?

        Or

        How can I restart thread a thread if it died with same thread Id?

        # some code here.... for (0 ..3)) { my $thr = threads->create ( sub { worker(); } )->detach(); } # Master Thread while (1) { master(); }