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

Re: Passing an IO:Handle to a Thread

Thread Previous | Thread Next
From:
Chris Hall
Date:
March 1, 2008 06:52
Subject:
Re: Passing an IO:Handle to a Thread
Message ID:
dd2ztabn1WyHFw14@agrotera.halldom.com
On Fri, 29 Feb 2008 Dave Mitchell wrote
>On Wed, Feb 27, 2008 at 08:15:36AM -0800, Dean Arnold wrote:
>> As to shared object destruction:
>>
>> pre-5.10.0: once per thread, requires some extra bookkeeping to make sure
>> it "does the right thing"
>>
>> 5.10.0: once in the last referencing thread (fixed in CORE)

>Huh?
>
>    use warnings;
>    use strict;
>
>    use threads;
>    use threads::shared;
>
>    sub DESTROY { warn "DESTROY $_[0]\n" }
>
>    my $h = bless {};
>    share $h;
>    threads->new(sub {})->join;
>
>$ perl5100t /tmp/p
>DESTROY main=HASH(0x98fb844)
>DESTROY main=HASH(0x98748c4)
>$

I had a feeling that there was some significance attached to the order 
of the blessing and sharing.  Now I'm not so sure...

...but I have tried the following:

---Test-1---
I add a little to the above, ending up with:

     use warnings;
     use strict;

     use threads;
     use threads::shared;

     print "threads v$threads::VERSION",
           " & threads::shared v$threads::shared::VERSION\n" ;

     sub DESTROY { my $s = shift ; warn "DESTROY $s: ", %$s, "\n" }

     my $h = bless {Test => -1} ;            # )
     warn "Object \$h is $h: ", %$h, "\n" ;  # ) Object construction
     share $h;                               # )

     threads->new(sub {})->join;

which gives me:

   Perl v5.10.0 & threads v1.67 & threads::shared v1.14
   Object $h is main=HASH(0x22b08c): Test-1
   DESTROY main=HASH(0x18b305c):
   DESTROY main=HASH(0x22b08c):

and:

   Perl v5.8.8 & threads v1.69 & threads::shared v1.17
   Object $h is main=HASH(0x6054e0): Test-1
   DESTROY main=HASH(0x722ca0):
   DESTROY main=HASH(0x6054e0):

Noting the empty Hashes !

So, whatever share $h does, it doesn't appear to be to cause the thing 
pointed to by $h to become shared -- or perhaps it does, but empties it.

---Test-2---
Replacing the object construction bit by:

     my %b : shared = (Test => -1) ;
     my $h = bless \%b ;

gives:

   Perl v5.10.0 & threads v1.67 & threads::shared v1.14
   Address \%b is: HASH(0x1887814), Value: Test-2
   DESTROY main=HASH(0x1887814): Test-2

and:

   Perl v5.8.8 & threads v1.69 & threads::shared v1.17
   Address \%b is: HASH(0x6b0f80), Value: Test-2
   DESTROY main=HASH(0x6b0f80): Test-2

Which is the expected behaviour for V5.10.0, but not for v5.8.8 ?

Note that the shared hash is blessed: suggesting the order is 
significant.

---Test-3---
However:

     my $h = &share({Test => -3}) ;
     warn "Scalar \$h is $h:", %$h, "\n" ;
     bless $h ;

which you might think would work, doesn't:

   Perl v5.10.0 & threads v1.67 & threads::shared v1.14
   Scalar $h is HASH(0x22b08c):
   DESTROY main=HASH(0x18b52d4):
   DESTROY main=HASH(0x22b08c):

and similarly for v5.8.8.

---Test-4---
So... perhaps it's share that I don't understand, so I tried.

     my $h = &share({}) ;
     %$h = (Test => -4) ;
     bless $h ;
     warn "Object \$h is $h: ", %$h, "\n" ;

gives:

   Perl v5.10.0 & threads v1.67 & threads::shared v1.14
   Object $h is main=HASH(0x22b08c): Test-4
   DESTROY main=HASH(0x18b72e4): Test-4
   DESTROY main=HASH(0x22b08c): Test-4

and similarly for v5.8.8.

---Conclusion---

Well, I'm stumped.

Whatever share $h does, it doesn't appear useful when $h is a ref to 
something.

Whatever my $h = &share({}) does, it's not the same as
          my %b : shared ; my $h = \%b ;

Whatever &share({a => 1}) does, it doesn't return a ref to an anonymous 
hash containing a => 1 !!

I don't see any difference between v5.10.0 and 5.8.8... could be that 
I'm using late model threads & threads::shared with v5.8.8 ?

Chris
-- 
Chris Hall               highwayman.com            +44 7970 277 383

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