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

Re: p5p summary: Improving threads::shared ?

Thread Previous | Thread Next
From:
Dean Arnold
Date:
May 5, 2008 09:35
Subject:
Re: p5p summary: Improving threads::shared ?
Message ID:
481F3735.5070505@presicient.com
Jerry D. Hedden wrote:
> 
> I've attached my reworked version of T::Q that I think takes
> care of circular references.  Would you mind giving it a
> going over?  (It passes all the currents tests in its test
> suite, so I know I didn't break anything.)  Thanks.

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.

Anyway, my updated version of the test follows.

- Dean

use strict;
use warnings;
use threads;
use threads::shared;
use Thread::Queue;
use Data::Dumper;

my $q = Thread::Queue->new();

my $x = [ { 'complex' => 'aggregate' },
	[ qw/ currently not sharable / ] ];

my $thrd = threads->create(\&receiver, $q);

$q->enqueue($x);

$thrd->join();

print "*** non-recursive OK\n";

#
#	Make it a recursive structure
#	(!!! this will choke)
#
push @$x, $x;

$thrd = threads->create(\&receiver, $q);

$q->enqueue($x);

print "*** enq'd\n";

$thrd->join();

print "*** recursive OK\n";


sub receiver {
	my $q = shift;
	print "*** starting child\n";
	my $data = $q->dequeue();
	print "*** deq'd\n";

	if ($#$data == 1) {
		print "** in child:\n", Dumper($data), "\n";
	}
	elsif (($#$data != 2) || (ref $data->[2] ne 'ARRAY')) {
		print "NOT OK: $#$data $data $data->[2]\n";
	}
	else {
		print "** in child:\n", Dumper($data->[0], $data->[1]), "\n";
	}
}



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