develooper Front page | perl.ithreads | Postings from May 2008

Re: p5p summary: Improving threads::shared ?

Thread Previous | Thread Next
From:
Jerry D. Hedden
Date:
May 5, 2008 10:53
Subject:
Re: p5p summary: Improving threads::shared ?
Message ID:
1ff86f510805051053w7dfe06aap74525efb9eda9123@mail.gmail.com
>  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.

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About