1package threads::shared; 2 3use 5.008; 4 5use strict; 6use warnings; 7 8use Scalar::Util qw(reftype refaddr blessed); 9 10our $VERSION = '1.40'; 11my $XS_VERSION = $VERSION; 12$VERSION = eval $VERSION; 13 14# Declare that we have been loaded 15$threads::shared::threads_shared = 1; 16 17# Load the XS code, if applicable 18if ($threads::threads) { 19 require XSLoader; 20 XSLoader::load('threads::shared', $XS_VERSION); 21 22 *is_shared = \&_id; 23 24} else { 25 # String eval is generally evil, but we don't want these subs to 26 # exist at all if 'threads' is not loaded successfully. 27 # Vivifying them conditionally this way saves on average about 4K 28 # of memory per thread. 29 eval <<'_MARKER_'; 30 sub share (\[$@%]) { return $_[0] } 31 sub is_shared (\[$@%]) { undef } 32 sub cond_wait (\[$@%];\[$@%]) { undef } 33 sub cond_timedwait (\[$@%]$;\[$@%]) { undef } 34 sub cond_signal (\[$@%]) { undef } 35 sub cond_broadcast (\[$@%]) { undef } 36_MARKER_ 37} 38 39 40### Export ### 41 42sub import 43{ 44 # Exported subroutines 45 my @EXPORT = qw(share is_shared cond_wait cond_timedwait 46 cond_signal cond_broadcast shared_clone); 47 if ($threads::threads) { 48 push(@EXPORT, 'bless'); 49 } 50 51 # Export subroutine names 52 my $caller = caller(); 53 foreach my $sym (@EXPORT) { 54 no strict 'refs'; 55 *{$caller.'::'.$sym} = \&{$sym}; 56 } 57} 58 59 60# Predeclarations for internal functions 61my ($make_shared); 62 63 64### Methods, etc. ### 65 66sub threads::shared::tie::SPLICE 67{ 68 require Carp; 69 Carp::croak('Splice not implemented for shared arrays'); 70} 71 72 73# Create a thread-shared clone of a complex data structure or object 74sub shared_clone 75{ 76 if (@_ != 1) { 77 require Carp; 78 Carp::croak('Usage: shared_clone(REF)'); 79 } 80 81 return $make_shared->(shift, {}); 82} 83 84 85### Internal Functions ### 86 87# Used by shared_clone() to recursively clone 88# a complex data structure or object 89$make_shared = sub { 90 my ($item, $cloned) = @_; 91 92 # Just return the item if: 93 # 1. Not a ref; 94 # 2. Already shared; or 95 # 3. Not running 'threads'. 96 return $item if (! ref($item) || is_shared($item) || ! $threads::threads); 97 98 # Check for previously cloned references 99 # (this takes care of circular refs as well) 100 my $addr = refaddr($item); 101 if (exists($cloned->{$addr})) { 102 # Return the already existing clone 103 return $cloned->{$addr}; 104 } 105 106 # Make copies of array, hash and scalar refs and refs of refs 107 my $copy; 108 my $ref_type = reftype($item); 109 110 # Copy an array ref 111 if ($ref_type eq 'ARRAY') { 112 # Make empty shared array ref 113 $copy = &share([]); 114 # Add to clone checking hash 115 $cloned->{$addr} = $copy; 116 # Recursively copy and add contents 117 push(@$copy, map { $make_shared->($_, $cloned) } @$item); 118 } 119 120 # Copy a hash ref 121 elsif ($ref_type eq 'HASH') { 122 # Make empty shared hash ref 123 $copy = &share({}); 124 # Add to clone checking hash 125 $cloned->{$addr} = $copy; 126 # Recursively copy and add contents 127 foreach my $key (keys(%{$item})) { 128 $copy->{$key} = $make_shared->($item->{$key}, $cloned); 129 } 130 } 131 132 # Copy a scalar ref 133 elsif ($ref_type eq 'SCALAR') { 134 $copy = \do{ my $scalar = $$item; }; 135 share($copy); 136 # Add to clone checking hash 137 $cloned->{$addr} = $copy; 138 } 139 140 # Copy of a ref of a ref 141 elsif ($ref_type eq 'REF') { 142 # Special handling for $x = \$x 143 if ($addr == refaddr($$item)) { 144 $copy = \$copy; 145 share($copy); 146 $cloned->{$addr} = $copy; 147 } else { 148 my $tmp; 149 $copy = \$tmp; 150 share($copy); 151 # Add to clone checking hash 152 $cloned->{$addr} = $copy; 153 # Recursively copy and add contents 154 $tmp = $make_shared->($$item, $cloned); 155 } 156 157 } else { 158 require Carp; 159 Carp::croak("Unsupported ref type: ", $ref_type); 160 } 161 162 # If input item is an object, then bless the copy into the same class 163 if (my $class = blessed($item)) { 164 bless($copy, $class); 165 } 166 167 # Clone READONLY flag 168 if ($ref_type eq 'SCALAR') { 169 if (Internals::SvREADONLY($$item)) { 170 Internals::SvREADONLY($$copy, 1) if ($] >= 5.008003); 171 } 172 } 173 if (Internals::SvREADONLY($item)) { 174 Internals::SvREADONLY($copy, 1) if ($] >= 5.008003); 175 } 176 177 return $copy; 178}; 179 1801; 181 182__END__ 183 184=head1 NAME 185 186threads::shared - Perl extension for sharing data structures between threads 187 188=head1 VERSION 189 190This document describes threads::shared version 1.40 191 192=head1 SYNOPSIS 193 194 use threads; 195 use threads::shared; 196 197 my $var :shared; 198 my %hsh :shared; 199 my @ary :shared; 200 201 my ($scalar, @array, %hash); 202 share($scalar); 203 share(@array); 204 share(%hash); 205 206 $var = $scalar_value; 207 $var = $shared_ref_value; 208 $var = shared_clone($non_shared_ref_value); 209 $var = shared_clone({'foo' => [qw/foo bar baz/]}); 210 211 $hsh{'foo'} = $scalar_value; 212 $hsh{'bar'} = $shared_ref_value; 213 $hsh{'baz'} = shared_clone($non_shared_ref_value); 214 $hsh{'quz'} = shared_clone([1..3]); 215 216 $ary[0] = $scalar_value; 217 $ary[1] = $shared_ref_value; 218 $ary[2] = shared_clone($non_shared_ref_value); 219 $ary[3] = shared_clone([ {}, [] ]); 220 221 { lock(%hash); ... } 222 223 cond_wait($scalar); 224 cond_timedwait($scalar, time() + 30); 225 cond_broadcast(@array); 226 cond_signal(%hash); 227 228 my $lockvar :shared; 229 # condition var != lock var 230 cond_wait($var, $lockvar); 231 cond_timedwait($var, time()+30, $lockvar); 232 233=head1 DESCRIPTION 234 235By default, variables are private to each thread, and each newly created 236thread gets a private copy of each existing variable. This module allows you 237to share variables across different threads (and pseudo-forks on Win32). It 238is used together with the L<threads> module. 239 240This module supports the sharing of the following data types only: scalars 241and scalar refs, arrays and array refs, and hashes and hash refs. 242 243=head1 EXPORT 244 245The following functions are exported by this module: C<share>, 246C<shared_clone>, C<is_shared>, C<cond_wait>, C<cond_timedwait>, C<cond_signal> 247and C<cond_broadcast> 248 249Note that if this module is imported when L<threads> has not yet been loaded, 250then these functions all become no-ops. This makes it possible to write 251modules that will work in both threaded and non-threaded environments. 252 253=head1 FUNCTIONS 254 255=over 4 256 257=item share VARIABLE 258 259C<share> takes a variable and marks it as shared: 260 261 my ($scalar, @array, %hash); 262 share($scalar); 263 share(@array); 264 share(%hash); 265 266C<share> will return the shared rvalue, but always as a reference. 267 268Variables can also be marked as shared at compile time by using the 269C<:shared> attribute: 270 271 my ($var, %hash, @array) :shared; 272 273Shared variables can only store scalars, refs of shared variables, or 274refs of shared data (discussed in next section): 275 276 my ($var, %hash, @array) :shared; 277 my $bork; 278 279 # Storing scalars 280 $var = 1; 281 $hash{'foo'} = 'bar'; 282 $array[0] = 1.5; 283 284 # Storing shared refs 285 $var = \%hash; 286 $hash{'ary'} = \@array; 287 $array[1] = \$var; 288 289 # The following are errors: 290 # $var = \$bork; # ref of non-shared variable 291 # $hash{'bork'} = []; # non-shared array ref 292 # push(@array, { 'x' => 1 }); # non-shared hash ref 293 294=item shared_clone REF 295 296C<shared_clone> takes a reference, and returns a shared version of its 297argument, performing a deep copy on any non-shared elements. Any shared 298elements in the argument are used as is (i.e., they are not cloned). 299 300 my $cpy = shared_clone({'foo' => [qw/foo bar baz/]}); 301 302Object status (i.e., the class an object is blessed into) is also cloned. 303 304 my $obj = {'foo' => [qw/foo bar baz/]}; 305 bless($obj, 'Foo'); 306 my $cpy = shared_clone($obj); 307 print(ref($cpy), "\n"); # Outputs 'Foo' 308 309For cloning empty array or hash refs, the following may also be used: 310 311 $var = &share([]); # Same as $var = shared_clone([]); 312 $var = &share({}); # Same as $var = shared_clone({}); 313 314=item is_shared VARIABLE 315 316C<is_shared> checks if the specified variable is shared or not. If shared, 317returns the variable's internal ID (similar to 318L<refaddr()|Scalar::Util/"refaddr EXPR">). Otherwise, returns C<undef>. 319 320 if (is_shared($var)) { 321 print("\$var is shared\n"); 322 } else { 323 print("\$var is not shared\n"); 324 } 325 326When used on an element of an array or hash, C<is_shared> checks if the 327specified element belongs to a shared array or hash. (It does not check 328the contents of that element.) 329 330 my %hash :shared; 331 if (is_shared(%hash)) { 332 print("\%hash is shared\n"); 333 } 334 335 $hash{'elem'} = 1; 336 if (is_shared($hash{'elem'})) { 337 print("\$hash{'elem'} is in a shared hash\n"); 338 } 339 340=item lock VARIABLE 341 342C<lock> places a B<advisory> lock on a variable until the lock goes out of 343scope. If the variable is locked by another thread, the C<lock> call will 344block until it's available. Multiple calls to C<lock> by the same thread from 345within dynamically nested scopes are safe -- the variable will remain locked 346until the outermost lock on the variable goes out of scope. 347 348C<lock> follows references exactly I<one> level: 349 350 my %hash :shared; 351 my $ref = \%hash; 352 lock($ref); # This is equivalent to lock(%hash) 353 354Note that you cannot explicitly unlock a variable; you can only wait for the 355lock to go out of scope. This is most easily accomplished by locking the 356variable inside a block. 357 358 my $var :shared; 359 { 360 lock($var); 361 # $var is locked from here to the end of the block 362 ... 363 } 364 # $var is now unlocked 365 366As locks are advisory, they do not prevent data access or modification by 367another thread that does not itself attempt to obtain a lock on the variable. 368 369You cannot lock the individual elements of a container variable: 370 371 my %hash :shared; 372 $hash{'foo'} = 'bar'; 373 #lock($hash{'foo'}); # Error 374 lock(%hash); # Works 375 376If you need more fine-grained control over shared variable access, see 377L<Thread::Semaphore>. 378 379=item cond_wait VARIABLE 380 381=item cond_wait CONDVAR, LOCKVAR 382 383The C<cond_wait> function takes a B<locked> variable as a parameter, unlocks 384the variable, and blocks until another thread does a C<cond_signal> or 385C<cond_broadcast> for that same locked variable. The variable that 386C<cond_wait> blocked on is relocked after the C<cond_wait> is satisfied. If 387there are multiple threads C<cond_wait>ing on the same variable, all but one 388will re-block waiting to reacquire the lock on the variable. (So if you're only 389using C<cond_wait> for synchronisation, give up the lock as soon as possible). 390The two actions of unlocking the variable and entering the blocked wait state 391are atomic, the two actions of exiting from the blocked wait state and 392re-locking the variable are not. 393 394In its second form, C<cond_wait> takes a shared, B<unlocked> variable followed 395by a shared, B<locked> variable. The second variable is unlocked and thread 396execution suspended until another thread signals the first variable. 397 398It is important to note that the variable can be notified even if no thread 399C<cond_signal> or C<cond_broadcast> on the variable. It is therefore 400important to check the value of the variable and go back to waiting if the 401requirement is not fulfilled. For example, to pause until a shared counter 402drops to zero: 403 404 { lock($counter); cond_wait($counter) until $counter == 0; } 405 406=item cond_timedwait VARIABLE, ABS_TIMEOUT 407 408=item cond_timedwait CONDVAR, ABS_TIMEOUT, LOCKVAR 409 410In its two-argument form, C<cond_timedwait> takes a B<locked> variable and an 411absolute timeout as parameters, unlocks the variable, and blocks until the 412timeout is reached or another thread signals the variable. A false value is 413returned if the timeout is reached, and a true value otherwise. In either 414case, the variable is re-locked upon return. 415 416Like C<cond_wait>, this function may take a shared, B<locked> variable as an 417additional parameter; in this case the first parameter is an B<unlocked> 418condition variable protected by a distinct lock variable. 419 420Again like C<cond_wait>, waking up and reacquiring the lock are not atomic, 421and you should always check your desired condition after this function 422returns. Since the timeout is an absolute value, however, it does not have to 423be recalculated with each pass: 424 425 lock($var); 426 my $abs = time() + 15; 427 until ($ok = desired_condition($var)) { 428 last if !cond_timedwait($var, $abs); 429 } 430 # we got it if $ok, otherwise we timed out! 431 432=item cond_signal VARIABLE 433 434The C<cond_signal> function takes a B<locked> variable as a parameter and 435unblocks one thread that's C<cond_wait>ing on that variable. If more than one 436thread is blocked in a C<cond_wait> on that variable, only one (and which one 437is indeterminate) will be unblocked. 438 439If there are no threads blocked in a C<cond_wait> on the variable, the signal 440is discarded. By always locking before signaling, you can (with care), avoid 441signaling before another thread has entered cond_wait(). 442 443C<cond_signal> will normally generate a warning if you attempt to use it on an 444unlocked variable. On the rare occasions where doing this may be sensible, you 445can suppress the warning with: 446 447 { no warnings 'threads'; cond_signal($foo); } 448 449=item cond_broadcast VARIABLE 450 451The C<cond_broadcast> function works similarly to C<cond_signal>. 452C<cond_broadcast>, though, will unblock B<all> the threads that are blocked in 453a C<cond_wait> on the locked variable, rather than only one. 454 455=back 456 457=head1 OBJECTS 458 459L<threads::shared> exports a version of L<bless()|perlfunc/"bless REF"> that 460works on shared objects such that I<blessings> propagate across threads. 461 462 # Create a shared 'Foo' object 463 my $foo :shared = shared_clone({}); 464 bless($foo, 'Foo'); 465 466 # Create a shared 'Bar' object 467 my $bar :shared = shared_clone({}); 468 bless($bar, 'Bar'); 469 470 # Put 'bar' inside 'foo' 471 $foo->{'bar'} = $bar; 472 473 # Rebless the objects via a thread 474 threads->create(sub { 475 # Rebless the outer object 476 bless($foo, 'Yin'); 477 478 # Cannot directly rebless the inner object 479 #bless($foo->{'bar'}, 'Yang'); 480 481 # Retrieve and rebless the inner object 482 my $obj = $foo->{'bar'}; 483 bless($obj, 'Yang'); 484 $foo->{'bar'} = $obj; 485 486 })->join(); 487 488 print(ref($foo), "\n"); # Prints 'Yin' 489 print(ref($foo->{'bar'}), "\n"); # Prints 'Yang' 490 print(ref($bar), "\n"); # Also prints 'Yang' 491 492=head1 NOTES 493 494L<threads::shared> is designed to disable itself silently if threads are not 495available. This allows you to write modules and packages that can be used 496in both threaded and non-threaded applications. 497 498If you want access to threads, you must C<use threads> before you 499C<use threads::shared>. L<threads> will emit a warning if you use it after 500L<threads::shared>. 501 502=head1 BUGS AND LIMITATIONS 503 504When C<share> is used on arrays, hashes, array refs or hash refs, any data 505they contain will be lost. 506 507 my @arr = qw(foo bar baz); 508 share(@arr); 509 # @arr is now empty (i.e., == ()); 510 511 # Create a 'foo' object 512 my $foo = { 'data' => 99 }; 513 bless($foo, 'foo'); 514 515 # Share the object 516 share($foo); # Contents are now wiped out 517 print("ERROR: \$foo is empty\n") 518 if (! exists($foo->{'data'})); 519 520Therefore, populate such variables B<after> declaring them as shared. (Scalar 521and scalar refs are not affected by this problem.) 522 523It is often not wise to share an object unless the class itself has been 524written to support sharing. For example, an object's destructor may get 525called multiple times, once for each thread's scope exit. Another danger is 526that the contents of hash-based objects will be lost due to the above 527mentioned limitation. See F<examples/class.pl> (in the CPAN distribution of 528this module) for how to create a class that supports object sharing. 529 530Destructors may not be called on objects if those objects still exist at 531global destruction time. If the destructors must be called, make sure 532there are no circular references and that nothing is referencing the 533objects, before the program ends. 534 535Does not support C<splice> on arrays. Does not support explicitly changing 536array lengths via $#array -- use C<push> and C<pop> instead. 537 538Taking references to the elements of shared arrays and hashes does not 539autovivify the elements, and neither does slicing a shared array/hash over 540non-existent indices/keys autovivify the elements. 541 542C<share()> allows you to C<< share($hashref->{key}) >> and 543C<< share($arrayref->[idx]) >> without giving any error message. But the 544C<< $hashref->{key} >> or C<< $arrayref->[idx] >> is B<not> shared, causing 545the error "lock can only be used on shared values" to occur when you attempt 546to C<< lock($hasref->{key}) >> or C<< lock($arrayref->[idx]) >> in another 547thread. 548 549Using L<refaddr()|Scalar::Util/"refaddr EXPR">) is unreliable for testing 550whether or not two shared references are equivalent (e.g., when testing for 551circular references). Use L<is_shared()|/"is_shared VARIABLE">, instead: 552 553 use threads; 554 use threads::shared; 555 use Scalar::Util qw(refaddr); 556 557 # If ref is shared, use threads::shared's internal ID. 558 # Otherwise, use refaddr(). 559 my $addr1 = is_shared($ref1) || refaddr($ref1); 560 my $addr2 = is_shared($ref2) || refaddr($ref2); 561 562 if ($addr1 == $addr2) { 563 # The refs are equivalent 564 } 565 566L<each()|perlfunc/"each HASH"> does not work properly on shared references 567embedded in shared structures. For example: 568 569 my %foo :shared; 570 $foo{'bar'} = shared_clone({'a'=>'x', 'b'=>'y', 'c'=>'z'}); 571 572 while (my ($key, $val) = each(%{$foo{'bar'}})) { 573 ... 574 } 575 576Either of the following will work instead: 577 578 my $ref = $foo{'bar'}; 579 while (my ($key, $val) = each(%{$ref})) { 580 ... 581 } 582 583 foreach my $key (keys(%{$foo{'bar'}})) { 584 my $val = $foo{'bar'}{$key}; 585 ... 586 } 587 588View existing bug reports at, and submit any new bugs, problems, patches, etc. 589to: L<http://rt.cpan.org/Public/Dist/Display.html?Name=threads-shared> 590 591=head1 SEE ALSO 592 593L<threads::shared> Discussion Forum on CPAN: 594L<http://www.cpanforum.com/dist/threads-shared> 595 596L<threads>, L<perlthrtut> 597 598L<http://www.perl.com/pub/a/2002/06/11/threads.html> and 599L<http://www.perl.com/pub/a/2002/09/04/threads.html> 600 601Perl threads mailing list: 602L<http://lists.perl.org/list/ithreads.html> 603 604=head1 AUTHOR 605 606Artur Bergman E<lt>sky AT crucially DOT netE<gt> 607 608Documentation borrowed from the old Thread.pm. 609 610CPAN version produced by Jerry D. Hedden E<lt>jdhedden AT cpan DOT orgE<gt>. 611 612=head1 LICENSE 613 614threads::shared is released under the same license as Perl. 615 616=cut 617