>  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.

Reply via email to