http://www.perlmonks.org?node_id=288039


in reply to Things you need to know before programming Perl ithreads

liz++, thanks.

I got curious about how closures would do, so I tried your technique to see what happens (perl 5.8.1-RC2),

use threads(); { my $foo = 'bar'; sub foo () :lvalue { $foo } } threads->new( sub { foo = 'quux'; print 'thread: coderef = ', \&foo, $/; print 'foo is ', foo, $/; } )->join; print 'main: coderef = ', \&foo, $/; print 'foo is ', foo, $/; __END__ $ perl thrcl.pl thread: coderef = CODE(0x8129538) foo is quux main: coderef = CODE(0x8060674) foo is bar
so the object of the closure is duplicated - you did say everything, but I had to check.

Now, what if I want all threads to see the same thing?

use threads(); use threads::shared; { my $foo :shared = 'bar'; sub foo () :lvalue { $foo } } threads->new( sub { foo = 'quux'; print 'thread: coderef = ', \&foo, $/; print 'foo is ', foo, $/; } )->join; print 'main: coderef = ', \&foo, $/; print 'foo is ', foo, $/; __END__ $ perl thrcl.pl thread: coderef = CODE(0x8163924) foo is quux main: coderef = CODE(0x80fe448) foo is quux
so both foo()'s point to the same cloistered object.

Trying to stick the :shared attribute on sub foo did no good. I expected it to prevent duplication of the code, but perl smacked me down with,

$ perl thrcl.pl Invalid CODE attribute: shared at thrcl.pl line 5 BEGIN failed--compilation aborted at thrcl.pl line 5.
I suspect I need to read some more of the fine manual.

After Compline,
Zaxo