> My sample worked OK *after* I removed the Data::Dumper
> print; apparently, it has some issues w/ circular
> references as well (I tried setting Deepcopy and
> Purity, to no avail); I suspect its due to the fact
> that references to shared elements don't have the same
> stringified value, so it doesn't actually look like
> a circular ref.
Oh, yes. That's part of what I reported here:
http://rt.perl.org/rt3/Public/Bug/Display.html?id=37946
The following highlights the problem:
use strict;
use warnings;
use threads;
use threads::shared;
my $x;
$x = \$x;
share($x);
print("Look at \$x:\n");
print($x, "\n");
print($$x, "\n");
print($$$x, "\n");
print($$$$x, "\n");
print($$$$$x, "\n");
print($$$$$$x, "\n");
my @q :shared = ($x);
my $y = $q[0];
print("\nFirst look at \$y:\n");
print($y, "\n");
print($$y, "\n");
print($$$y, "\n");
print($$$$y, "\n");
print($$$$$y, "\n");
print($$$$$$y, "\n");
print("\nSecond look at \$y:\n");
print($y, "\n");
print($$y, "\n");
print($$$y, "\n");
print($$$$y, "\n");
print($$$$$y, "\n");
print($$$$$$y, "\n");
This outputs:
Look at $x:
REF(0x144f8f0)
REF(0x144f8f0)
REF(0x144f8f0)
REF(0x144f8f0)
REF(0x144f8f0)
REF(0x144f8f0)
First look at $y:
SCALAR(0x1423c70)
SCALAR(0x1423ad8)
SCALAR(0x14bd968)
SCALAR(0x14bd980)
SCALAR(0x14bd998)
SCALAR(0x14bd9b0)
Second look at $y:
REF(0x1423c70)
REF(0x1423ad8)
REF(0x14bd968)
REF(0x14bd980)
REF(0x14bd998)
SCALAR(0x14bd9b0)
Seems to me that this is a bug. It shows that
threads::shared isn't detecting that it's dealing with a
circular reference. With each level that the app traverses,
threads::shared "unrolls" another version of the shared
variable.