Viewing file: class.pl (2.93 KB) -rwxr-xr-x Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#!/usr/bin/perl
use strict; use warnings;
use threads; use threads::shared;
package My::Class; { use threads::shared qw(share shared_clone);
# Constructor sub new { my $class = shift; share(my %self);
# Add arguments to object hash while (my $tag = shift) { if (!@_) { require Carp; Carp::croak("Missing value for '$tag'"); } $self{$tag} = shared_clone(shift); }
return (bless(\%self, $class)); }
# Adds fields to a shared object sub set { my ($self, $tag, $value) = @_; lock($self); $self->{$tag} = shared_clone($value); }
sub DESTROY { my $self = shift; # Delete the contents of the object to ensure that # embedded objects are also destroyed properly. foreach my $key (keys(%$self)) { delete($self->{$key}); } } }
package main;
MAIN: { # Create an object containing some complex elements my $obj = My::Class->new('bar' => { 'ima' => 'hash' }, 'baz' => [ qw(shared array) ]);
# Create a thread threads->create(sub { # The thread shares the object print("Object has a $obj->{'bar'}->{'ima'}\n");
# Add some more data to the object push(@{$obj->{'baz'}}, qw(with five elements));
# Add a complex field to the object $obj->set('funk' => { 'yet' => [ qw(another hash) ] });
# Embed one object in another $obj->{'embedded'} = My::Class->new();
})->join();
# Show that the object picked up the data set by the thread print('Object has a ', join(' ', @{$obj->{'baz'}}), "\n"); print('Object has yet ', join(' ', @{$obj->{'funk'}->{'yet'}}), "\n"); print('Object as an embedded object of type ', ref($obj->{'embedded'}), "\n"); }
exit(0);
__END__
=head1 NAME
class.pl - Example 'threadsafe' class code
=head1 DESCRIPTION
This example class illustrates how to create hash-based objects that can be shared between threads using L<threads::shared>. In addition, it shows how to permit the objects' fields to contain arbitrarily complex data structures.
=over
=item my $obj = My::Class->new('key' => $value, ...)
The class contructor takes parameters in the form of C<key=E<gt>value> pairs, and adds them as fields to the newly created shared object. The I<values> may be any complex data structures, and are themselves made I<shared>.
=item $obj->set('key' => $value)
This method adds/sets a field for a shared object, making the value for the field I<shared> if necessary.
=back
=head1 SEE ALSO
L<threads>, L<threads::shared>
=head1 AUTHOR
Jerry D. Hedden, S<E<lt>jdhedden AT cpan DOT orgE<gt>>
=head1 COPYRIGHT AND LICENSE
Copyright 2006 - 2017 Jerry D. Hedden. All rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
=cut
|