in reply to Problem conditionally making variables shared if using threads

If I give the full variable module/name, it will work,

You haven't used threads::shared in the current scope (package), so how could it have exported its functions into that scope?

I try to use the Perl debugger, I have to use a reference to the variable.

You always have to pass a reference to threads::shared::share(); unless you disable the prototype.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
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". I'm with torvalds on this
In the absence of evidence, opinion is indistinguishable from prejudice. Agile (and TDD) debunked
  • Comment on Re: Problem conditionally making variables shared if using threads
  • Download Code

Replies are listed 'Best First'.
Re^2: Problem conditionally making variables shared if using threads
by billgdev (Initiate) on Feb 18, 2015 at 21:25 UTC
    You haven't used threads::shared in the current scope (package)

    Isn't that accomplished by using use Module::Load::Conditional qw[can_load];?

    You always have to pass a reference to threads::shared::share(); unless you disable the prototype

    Disable the prototype? I'm not sure what you mean by that. Explicitly using &share($gnWarning) makes no difference, if that's what you mean.

    If you know of any way to configure a program to use threads based on the perl executable being compiled with it, and not use it otherwise, other than the method I'm trying, I'd be interested to know.

      From the Module::Load::Conditional POD for can_load:

      autoload

      This controls whether imports the functions of a loaded modules to the caller package. The default is no importing any functions.

      You haven't asked for the exported functions to be imported into your package.

      Disable the prototype? I'm not sure what you mean by that. Explicitly using &share...

      You got it :)

      Explicitly using &share($gnWarning) makes no difference,

      It won't if share() has not been imported into your package; unless you fully qualify it.

      If you know of any way to configure a program to use threads based on the perl executable being compiled with it, and not use it otherwise, other than the method I'm trying, I'd be interested to know.
      use Config; if( $Config{ useithreads } eq 'define' ) { ## compiled with ithreads require threads; threads->import; require threads::shared; threads::shared->import } else { ## not }

      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      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". I'm with torvalds on this
      In the absence of evidence, opinion is indistinguishable from prejudice. Agile (and TDD) debunked

        Indeed. Also, you need to not rely on compile-time magic. This usually boils down to just not omitting parens on your calls to imported functions.

        - tye