package dummy; use threads; use threads::shared; use strict; use warnings; sub new{ my %self : shared = qw[ there are some parameters here 1 ]; return bless \%self, $_[0]; } sub get{ my $self = shift; @{ %$self }{ @_ || sort keys %$self } ; } sub put{ my $self = shift; lock %$self; $self->{ +shift } = shift while @_; } package main; use threads; use threads::shared; use Thread::Queue; use strict; use warnings; our $N ||= 10; sub t { my ($q) = @_; my $tid = threads->self->tid; my $obj = $q->dequeue(); sleep 1; warn "$tid: ", join'|', $obj->get(), $/; sleep rand 10; $obj->put( $tid, $tid ); warn "$tid: ", join'|', $obj->get(), $/; } my $q = Thread::Queue->new(); my @t = map{ threads->create( \&t, $q ) } 1 .. $N; my $obj = new dummy; print join '|', $obj->get, $/; $q->enqueue( $obj ) for @t; $_->join for @t; print join '|', $obj->get; _END_ C:\Perl>perl globthrd.pl 1|parameters|are| 1: 1|parameters|are| 2: 1|parameters|are| 3: 1|parameters|are| 4: 1|parameters|are| 5: 1|parameters|are| 6: 1|parameters|are| 7: 1|parameters|are| 8: 1|parameters|are| 9: 1|parameters|are| 10: 1|parameters|are| 3: 3|1|parameters|are| 1: 1|3|1|parameters|are| 4: 1|3|4|1|parameters|are| 8: 1|3|4|8|1|parameters|are| 9: 1|3|4|8|9|1|parameters|are| 5: 1|3|4|5|8|9|1|parameters|are| 7: 1|3|4|5|7|8|9|1|parameters|are| 10: 1|10|3|4|5|7|8|9|1|parameters|are| 2: 1|10|2|3|4|5|7|8|9|1|parameters|are| 6: 1|10|2|3|4|5|6|7|8|9|1|parameters|are| 1|10|2|3|4|5|6|7|8|9|1|parameters|are