mr_p has asked for the wisdom of the Perl Monks concerning the following question:

Hello again Monks,

I wanted to know scope of threads when I include package. I have a package called SPFTP and wanted to know if global variables will be global only to each thread, meaning each thread will have their own global vairables.

SPFTP is package.

# some code here.... for (0 ..3)) { my $thr = threads->create ( sub { my global_var; use SPFtp qw(/^\$/); use SPFtp qw (Connect Login PrepareLsFtpList deleteFile Get +File GetFileSize Logout GetMessage CheckConnection); worker(); } )->detach(); } # Master Thread while (1) { my global_var; use SPFtp qw(/^\$/); use SPFtp qw (Connect Login PrepareLsFtpList deleteFile GetFile G +etFileSize Logout GetMessage CheckConnection); master(); }

The question is does any "our" variable that is declared in SPFTP.pm unique to its self/thread? Also, will global_var be global variables?

Replies are listed 'Best First'.
Re: Scope of thread variable
by BrowserUk (Patriarch) on Apr 07, 2010 at 18:47 UTC

    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.
      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.
Re: Scope of thread variable
by ikegami (Patriarch) on Apr 07, 2010 at 18:44 UTC
    Perl variables aren't shared between threads unless you explicitly share them

      ... but global values assigned to, prior to spawning a thread that also references that same global, will retain a value. But that value may not 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.
      So, what If I have below statements one declared in the beginning is same as when starting up threads? <code> use SPFtp qw(/^\$/); use SPFtp qw (Connect Login PrepareLsFtpList deleteFile GetFile GetFileSize Logout GetMessage CheckConnection); <code>