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
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.