Re: Passing an IO:Handle to a Thread

[email protected] (Chris Hall) Sat, 1 Mar 2008 14:51:19 +0000
Newsgroups perl.ithreads
Message-ID <[email protected]>
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
signature.asc (application/pgp-signature, 470 B)
-----BEGIN PGP SIGNATURE-----
Version: PGP SDK 3.8.3

iQEVAwUAR8ltZug9H9B04S2cAQJBAwf/c+lH0bMhMT5UXz0LLqvjN5rHu63UPUZp
kKm3kI92eItmZteEmyx/IvpX41C0WNUlqjPxzmTTs09Py0yA3owsLc9zC0nTSWqW
bcV8f/pHYIz163Gm+KM3AaN07qNe2ekWvI9IYdCCteV3gDe4lgDF6VDj6uCnyIbL
yhxzKvdyWPmz8B6Ry/dbrJFgqyIOYgUGy4XI+p2Y+EU5bandPdXkXF/qATzFrhHL
GSogYe79NlF9QLxjjTwJD5N/uAdCx6xT8g0ZnykN2p4Wj3DqiwMTl0nQdRnzMAel
CHXCbxXztspghygqMi0V33CTCT9naB9nly/dvNgpl7fNZEYMEAwfwA==
=e/sB
-----END PGP SIGNATURE-----