1 package threads::shared;
8 use Scalar::Util qw(reftype refaddr blessed);
10 our $VERSION = '1.34';
11 my $XS_VERSION = $VERSION;
12 $VERSION = eval $VERSION;
14 # Declare that we have been loaded
15 $threads::shared::threads_shared = 1;
17 # Load the XS code, if applicable
18 if ($threads::threads) {
20 XSLoader::load('threads::shared', $XS_VERSION);
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.
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 }
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');
51 # Export subroutine names
52 my $caller = caller();
53 foreach my $sym (@EXPORT) {
55 *{$caller.'::'.$sym} = \&{$sym};
60 # Predeclarations for internal functions
66 sub threads::shared::tie::SPLICE
69 Carp::croak('Splice not implemented for shared arrays');
73 # Create a thread-shared clone of a complex data structure or object
78 Carp::croak('Usage: shared_clone(REF)');
81 return $make_shared->(shift, {});
85 ### Internal Functions ###
87 # Used by shared_clone() to recursively clone
88 # a complex data structure or object
90 my ($item, $cloned) = @_;
92 # Just return the item if:
94 # 2. Already shared; or
95 # 3. Not running 'threads'.
96 return $item if (! ref($item) || is_shared($item) || ! $threads::threads);
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};
106 # Make copies of array, hash and scalar refs and refs of refs
108 my $ref_type = reftype($item);
111 if ($ref_type eq 'ARRAY') {
112 # Make empty shared array ref
114 # Add to clone checking hash
115 $cloned->{$addr} = $copy;
116 # Recursively copy and add contents
117 push(@$copy, map { $make_shared->($_, $cloned) } @$item);
121 elsif ($ref_type eq 'HASH') {
122 # Make empty shared hash ref
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);
133 elsif ($ref_type eq 'SCALAR') {
134 $copy = \do{ my $scalar = $$item; };
136 # Add to clone checking hash
137 $cloned->{$addr} = $copy;
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)) {
146 $cloned->{$addr} = $copy;
151 # Add to clone checking hash
152 $cloned->{$addr} = $copy;
153 # Recursively copy and add contents
154 $tmp = $make_shared->($$item, $cloned);
159 Carp::croak("Unsupported ref type: ", $ref_type);
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);
167 # Clone READONLY flag
168 if ($ref_type eq 'SCALAR') {
169 if (Internals::SvREADONLY($$item)) {
170 Internals::SvREADONLY($$copy, 1) if ($] >= 5.008003);
173 if (Internals::SvREADONLY($item)) {
174 Internals::SvREADONLY($copy, 1) if ($] >= 5.008003);
186 threads::shared - Perl extension for sharing data structures between threads
190 This document describes threads::shared version 1.34
201 my ($scalar, @array, %hash);
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/]});
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]);
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([ {}, [] ]);
224 cond_timedwait($scalar, time() + 30);
225 cond_broadcast(@array);
229 # condition var != lock var
230 cond_wait($var, $lockvar);
231 cond_timedwait($var, time()+30, $lockvar);
235 By default, variables are private to each thread, and each newly created
236 thread gets a private copy of each existing variable. This module allows you
237 to share variables across different threads (and pseudo-forks on Win32). It
238 is used together with the L<threads> module.
240 This module supports the sharing of the following data types only: scalars
241 and scalar refs, arrays and array refs, and hashes and hash refs.
245 The following functions are exported by this module: C<share>,
246 C<shared_clone>, C<is_shared>, C<cond_wait>, C<cond_timedwait>, C<cond_signal>
247 and C<cond_broadcast>
249 Note that if this module is imported when L<threads> has not yet been loaded,
250 then these functions all become no-ops. This makes it possible to write
251 modules that will work in both threaded and non-threaded environments.
259 C<share> takes a variable and marks it as shared:
261 my ($scalar, @array, %hash);
266 C<share> will return the shared rvalue, but always as a reference.
268 Variables can also be marked as shared at compile time by using the
269 C<:shared> attribute:
271 my ($var, %hash, @array) :shared;
273 Shared variables can only store scalars, refs of shared variables, or
274 refs of shared data (discussed in next section):
276 my ($var, %hash, @array) :shared;
281 $hash{'foo'} = 'bar';
284 # Storing shared refs
286 $hash{'ary'} = \@array;
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
294 =item shared_clone REF
296 C<shared_clone> takes a reference, and returns a shared version of its
297 argument, performing a deep copy on any non-shared elements. Any shared
298 elements in the argument are used as is (i.e., they are not cloned).
300 my $cpy = shared_clone({'foo' => [qw/foo bar baz/]});
302 Object status (i.e., the class an object is blessed into) is also cloned.
304 my $obj = {'foo' => [qw/foo bar baz/]};
306 my $cpy = shared_clone($obj);
307 print(ref($cpy), "\n"); # Outputs 'Foo'
309 For cloning empty array or hash refs, the following may also be used:
311 $var = &share([]); # Same as $var = shared_clone([]);
312 $var = &share({}); # Same as $var = shared_clone({});
314 =item is_shared VARIABLE
316 C<is_shared> checks if the specified variable is shared or not. If shared,
317 returns the variable's internal ID (similar to
318 L<refaddr()|Scalar::Util/"refaddr EXPR">). Otherwise, returns C<undef>.
320 if (is_shared($var)) {
321 print("\$var is shared\n");
323 print("\$var is not shared\n");
326 When used on an element of an array or hash, C<is_shared> checks if the
327 specified element belongs to a shared array or hash. (It does not check
328 the contents of that element.)
331 if (is_shared(%hash)) {
332 print("\%hash is shared\n");
336 if (is_shared($hash{'elem'})) {
337 print("\$hash{'elem'} is in a shared hash\n");
342 C<lock> places a B<advisory> lock on a variable until the lock goes out of
343 scope. If the variable is locked by another thread, the C<lock> call will
344 block until it's available. Multiple calls to C<lock> by the same thread from
345 within dynamically nested scopes are safe -- the variable will remain locked
346 until the outermost lock on the variable goes out of scope.
348 C<lock> follows references exactly I<one> level:
352 lock($ref); # This is equivalent to lock(%hash)
354 Note that you cannot explicitly unlock a variable; you can only wait for the
355 lock to go out of scope. This is most easily accomplished by locking the
356 variable inside a block.
361 # $var is locked from here to the end of the block
364 # $var is now unlocked
366 As locks are advisory, they do not prevent data access or modification by
367 another thread that does not itself attempt to obtain a lock on the variable.
369 You cannot lock the individual elements of a container variable:
372 $hash{'foo'} = 'bar';
373 #lock($hash{'foo'}); # Error
376 If you need more fine-grained control over shared variable access, see
377 L<Thread::Semaphore>.
379 =item cond_wait VARIABLE
381 =item cond_wait CONDVAR, LOCKVAR
383 The C<cond_wait> function takes a B<locked> variable as a parameter, unlocks
384 the variable, and blocks until another thread does a C<cond_signal> or
385 C<cond_broadcast> for that same locked variable. The variable that
386 C<cond_wait> blocked on is relocked after the C<cond_wait> is satisfied. If
387 there are multiple threads C<cond_wait>ing on the same variable, all but one
388 will re-block waiting to reacquire the lock on the variable. (So if you're only
389 using C<cond_wait> for synchronisation, give up the lock as soon as possible).
390 The two actions of unlocking the variable and entering the blocked wait state
391 are atomic, the two actions of exiting from the blocked wait state and
392 re-locking the variable are not.
394 In its second form, C<cond_wait> takes a shared, B<unlocked> variable followed
395 by a shared, B<locked> variable. The second variable is unlocked and thread
396 execution suspended until another thread signals the first variable.
398 It is important to note that the variable can be notified even if no thread
399 C<cond_signal> or C<cond_broadcast> on the variable. It is therefore
400 important to check the value of the variable and go back to waiting if the
401 requirement is not fulfilled. For example, to pause until a shared counter
404 { lock($counter); cond_wait($counter) until $counter == 0; }
406 =item cond_timedwait VARIABLE, ABS_TIMEOUT
408 =item cond_timedwait CONDVAR, ABS_TIMEOUT, LOCKVAR
410 In its two-argument form, C<cond_timedwait> takes a B<locked> variable and an
411 absolute timeout as parameters, unlocks the variable, and blocks until the
412 timeout is reached or another thread signals the variable. A false value is
413 returned if the timeout is reached, and a true value otherwise. In either
414 case, the variable is re-locked upon return.
416 Like C<cond_wait>, this function may take a shared, B<locked> variable as an
417 additional parameter; in this case the first parameter is an B<unlocked>
418 condition variable protected by a distinct lock variable.
420 Again like C<cond_wait>, waking up and reacquiring the lock are not atomic,
421 and you should always check your desired condition after this function
422 returns. Since the timeout is an absolute value, however, it does not have to
423 be recalculated with each pass:
426 my $abs = time() + 15;
427 until ($ok = desired_condition($var)) {
428 last if !cond_timedwait($var, $abs);
430 # we got it if $ok, otherwise we timed out!
432 =item cond_signal VARIABLE
434 The C<cond_signal> function takes a B<locked> variable as a parameter and
435 unblocks one thread that's C<cond_wait>ing on that variable. If more than one
436 thread is blocked in a C<cond_wait> on that variable, only one (and which one
437 is indeterminate) will be unblocked.
439 If there are no threads blocked in a C<cond_wait> on the variable, the signal
440 is discarded. By always locking before signaling, you can (with care), avoid
441 signaling before another thread has entered cond_wait().
443 C<cond_signal> will normally generate a warning if you attempt to use it on an
444 unlocked variable. On the rare occasions where doing this may be sensible, you
445 can suppress the warning with:
447 { no warnings 'threads'; cond_signal($foo); }
449 =item cond_broadcast VARIABLE
451 The C<cond_broadcast> function works similarly to C<cond_signal>.
452 C<cond_broadcast>, though, will unblock B<all> the threads that are blocked in
453 a C<cond_wait> on the locked variable, rather than only one.
459 L<threads::shared> exports a version of L<bless()|perlfunc/"bless REF"> that
460 works on shared objects such that I<blessings> propagate across threads.
462 # Create a shared 'Foo' object
463 my $foo :shared = shared_clone({});
466 # Create a shared 'Bar' object
467 my $bar :shared = shared_clone({});
470 # Put 'bar' inside 'foo'
471 $foo->{'bar'} = $bar;
473 # Rebless the objects via a thread
474 threads->create(sub {
475 # Rebless the outer object
478 # Cannot directly rebless the inner object
479 #bless($foo->{'bar'}, 'Yang');
481 # Retrieve and rebless the inner object
482 my $obj = $foo->{'bar'};
484 $foo->{'bar'} = $obj;
488 print(ref($foo), "\n"); # Prints 'Yin'
489 print(ref($foo->{'bar'}), "\n"); # Prints 'Yang'
490 print(ref($bar), "\n"); # Also prints 'Yang'
494 L<threads::shared> is designed to disable itself silently if threads are not
495 available. This allows you to write modules and packages that can be used
496 in both threaded and non-threaded applications.
498 If you want access to threads, you must C<use threads> before you
499 C<use threads::shared>. L<threads> will emit a warning if you use it after
502 =head1 BUGS AND LIMITATIONS
504 When C<share> is used on arrays, hashes, array refs or hash refs, any data
505 they contain will be lost.
507 my @arr = qw(foo bar baz);
509 # @arr is now empty (i.e., == ());
511 # Create a 'foo' object
512 my $foo = { 'data' => 99 };
516 share($foo); # Contents are now wiped out
517 print("ERROR: \$foo is empty\n")
518 if (! exists($foo->{'data'}));
520 Therefore, populate such variables B<after> declaring them as shared. (Scalar
521 and scalar refs are not affected by this problem.)
523 It is often not wise to share an object unless the class itself has been
524 written to support sharing. For example, an object's destructor may get
525 called multiple times, once for each thread's scope exit. Another danger is
526 that the contents of hash-based objects will be lost due to the above
527 mentioned limitation. See F<examples/class.pl> (in the CPAN distribution of
528 this module) for how to create a class that supports object sharing.
530 Does not support C<splice> on arrays. Does not support explicitly changing
531 array lengths via $#array -- use C<push> and C<pop> instead.
533 Taking references to the elements of shared arrays and hashes does not
534 autovivify the elements, and neither does slicing a shared array/hash over
535 non-existent indices/keys autovivify the elements.
537 C<share()> allows you to C<< share($hashref->{key}) >> and
538 C<< share($arrayref->[idx]) >> without giving any error message. But the
539 C<< $hashref->{key} >> or C<< $arrayref->[idx] >> is B<not> shared, causing
540 the error "lock can only be used on shared values" to occur when you attempt
541 to C<< lock($hasref->{key}) >> or C<< lock($arrayref->[idx]) >> in another
544 Using L<refaddr()|Scalar::Util/"refaddr EXPR">) is unreliable for testing
545 whether or not two shared references are equivalent (e.g., when testing for
546 circular references). Use L<is_shared()/"is_shared VARIABLE">, instead:
550 use Scalar::Util qw(refaddr);
552 # If ref is shared, use threads::shared's internal ID.
553 # Otherwise, use refaddr().
554 my $addr1 = is_shared($ref1) || refaddr($ref1);
555 my $addr2 = is_shared($ref2) || refaddr($ref2);
557 if ($addr1 == $addr2) {
558 # The refs are equivalent
561 L<each()|perlfunc/"each HASH"> does not work properly on shared references
562 embedded in shared structures. For example:
565 $foo{'bar'} = shared_clone({'a'=>'x', 'b'=>'y', 'c'=>'z'});
567 while (my ($key, $val) = each(%{$foo{'bar'}})) {
571 Either of the following will work instead:
573 my $ref = $foo{'bar'};
574 while (my ($key, $val) = each(%{$ref})) {
578 foreach my $key (keys(%{$foo{'bar'}})) {
579 my $val = $foo{'bar'}{$key};
583 View existing bug reports at, and submit any new bugs, problems, patches, etc.
584 to: L<http://rt.cpan.org/Public/Dist/Display.html?Name=threads-shared>
588 L<threads::shared> Discussion Forum on CPAN:
589 L<http://www.cpanforum.com/dist/threads-shared>
591 Annotated POD for L<threads::shared>:
592 L<http://annocpan.org/~JDHEDDEN/threads-shared-1.34/shared.pm>
595 L<http://code.google.com/p/threads-shared/>
597 L<threads>, L<perlthrtut>
599 L<http://www.perl.com/pub/a/2002/06/11/threads.html> and
600 L<http://www.perl.com/pub/a/2002/09/04/threads.html>
602 Perl threads mailing list:
603 L<http://lists.cpan.org/showlist.cgi?name=iThreads>
607 Artur Bergman E<lt>sky AT crucially DOT netE<gt>
609 Documentation borrowed from the old Thread.pm.
611 CPAN version produced by Jerry D. Hedden E<lt>jdhedden AT cpan DOT orgE<gt>.
615 threads::shared is released under the same license as Perl.