Hello Torsten,

I tried your suggestions push(@fruits,share('apple')); and
push(@fruits,share(do {my $x='apple'})); but both did not work because
share can only take references, arrays, or hashes as input.  I tried
similar variations but no luck.  The fruits array is still initialized
multiple times.  I even created the global counter like you suggested:

my $counter :shared = 0;

and then in the handler method:

      {
               logTestMessage('Waiting for lock.');
               lock($counter);
               logTestMessage('Acquired lock.');
               if($counter == 0) {
                       logTestMessage('Increasing counter.');
                       $counter++;
               }
               logTestMessage('Releasing lock.');
       }

but even then, the counter is increased multiple times.  As far as
populating the fruits array goes, I believe after reading
http://perldoc.perl.org/threads/shared.html that my approach is
correct.  It specifically says in the Bugs and Limitations section
that one first declares a variable shared and then populates it.
Since 'apple', 'banana', and 'peach' are scalars, they do not have to
be explicitly shared.

You pointed me to a module in the modperl test suite.  I downloaded
modperl from http://perl.apache.org/download/index.html but there is
no t/response/TestPerl/ithreads.pm.  I also searched for the string
'threads::shared' in all directories but no luck.  Where did you get
this pm?

Sincerely,
Pawel

2011/8/2 Torsten Förtsch <torsten.foert...@gmx.net>:
> On Tuesday, 02 August 2011 20:24:46 Fred Moyer wrote:
>> I haven't used the worker mpm, but it looks like you might want to
>> preload your handler in the httpd parent process.
>
> Unlikely that that will help. threads::shared works by creating a
> separate perl interpreter to keep the shared values. That interpreter
> does not execute any program. It simply serves as shared storage. When a
> variable is then marked as shared it is assigned magic to have the normal
> accessor methods use the storage in the other interpreter. So, no matter
> when the variable or the interpreter executing a program is created
> shared variables are always fetched from the special storage interpreter.
>
> The special storage interpreter is a global variable at C-level.
>
> t/response/TestPerl/ithreads.pm in the modperl test suite exercises
> shared variables. I'd take this as a starting point. First, I'd create a
> simple shared scalar as a global counter. If that works (which I think it
> does) the rest is how to use threads::shared correctly.
>
> As for your code I think you could try to push shared apples like this
>
>  push(@fruits,share('apple'));
>
> Perhaps even
>
>  push(@fruits,share(do {my $x='apple'}));
>
> Torsten Förtsch
>
> --
> Need professional modperl support? Hire me! (http://foertsch.name)
>
> Like fantasy? http://kabatinte.net
>

Reply via email to