[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3-unattended/var/se3/unattended/install/linuxaux/opt/perl/lib/5.10.0/i586-linux-thread-multi/threads/ -> shared.pm (source)

   1  package threads::shared;
   2  
   3  use 5.008;
   4  
   5  use strict;
   6  use warnings;
   7  
   8  our $VERSION = '1.14';
   9  my $XS_VERSION = $VERSION;
  10  $VERSION = eval $VERSION;
  11  
  12  # Declare that we have been loaded
  13  $threads::shared::threads_shared = 1;
  14  
  15  # Load the XS code, if applicable
  16  if ($threads::threads) {
  17      require XSLoader;
  18      XSLoader::load('threads::shared', $XS_VERSION);
  19  
  20      *is_shared = \&_id;
  21  
  22  } else {
  23      # String eval is generally evil, but we don't want these subs to
  24      # exist at all if 'threads' is not loaded successfully.
  25      # Vivifying them conditionally this way saves on average about 4K
  26      # of memory per thread.
  27      eval <<'_MARKER_';
  28          sub share          (\[$@%])         { return $_[0] }
  29          sub is_shared      (\[$@%])         { undef }
  30          sub cond_wait      (\[$@%];\[$@%])  { undef }
  31          sub cond_timedwait (\[$@%]$;\[$@%]) { undef }
  32          sub cond_signal    (\[$@%])         { undef }
  33          sub cond_broadcast (\[$@%])         { undef }
  34  _MARKER_
  35  }
  36  
  37  
  38  ### Export ###
  39  
  40  sub import
  41  {
  42      # Exported subroutines
  43      my @EXPORT = qw(share is_shared cond_wait cond_timedwait
  44                      cond_signal cond_broadcast);
  45      if ($threads::threads) {
  46          push(@EXPORT, 'bless');
  47      }
  48  
  49      # Export subroutine names
  50      my $caller = caller();
  51      foreach my $sym (@EXPORT) {
  52          no strict 'refs';
  53          *{$caller.'::'.$sym} = \&{$sym};
  54      }
  55  }
  56  
  57  
  58  ### Methods, etc. ###
  59  
  60  sub threads::shared::tie::SPLICE
  61  {
  62      require Carp;
  63      Carp::croak('Splice not implemented for shared arrays');
  64  }
  65  
  66  1;
  67  
  68  __END__
  69  
  70  =head1 NAME
  71  
  72  threads::shared - Perl extension for sharing data structures between threads
  73  
  74  =head1 VERSION
  75  
  76  This document describes threads::shared version 1.14
  77  
  78  =head1 SYNOPSIS
  79  
  80    use threads;
  81    use threads::shared;
  82  
  83    my $var :shared;
  84    $var = $scalar_value;
  85    $var = $shared_ref_value;
  86    $var = share($simple_unshared_ref_value);
  87  
  88    my ($scalar, @array, %hash);
  89    share($scalar);
  90    share(@array);
  91    share(%hash);
  92    my $bar = &share([]);
  93    $hash{bar} = &share({});
  94  
  95    { lock(%hash); ...  }
  96  
  97    cond_wait($scalar);
  98    cond_timedwait($scalar, time() + 30);
  99    cond_broadcast(@array);
 100    cond_signal(%hash);
 101  
 102    my $lockvar :shared;
 103    # condition var != lock var
 104    cond_wait($var, $lockvar);
 105    cond_timedwait($var, time()+30, $lockvar);
 106  
 107  =head1 DESCRIPTION
 108  
 109  By default, variables are private to each thread, and each newly created
 110  thread gets a private copy of each existing variable.  This module allows you
 111  to share variables across different threads (and pseudo-forks on Win32).  It is
 112  used together with the L<threads> module.
 113  
 114  =head1 EXPORT
 115  
 116  C<share>, C<cond_wait>, C<cond_timedwait>, C<cond_signal>, C<cond_broadcast>,
 117  C<is_shared>
 118  
 119  Note that if this module is imported when L<threads> has not yet been loaded,
 120  then these functions all become no-ops.  This makes it possible to write
 121  modules that will work in both threaded and non-threaded environments.
 122  
 123  =head1 FUNCTIONS
 124  
 125  =over 4
 126  
 127  =item share VARIABLE
 128  
 129  C<share> takes a value and marks it as shared. You can share a scalar, array,
 130  hash, scalar ref, array ref, or hash ref.  C<share> will return the shared
 131  rvalue, but always as a reference.
 132  
 133  A variable can also be marked as shared at compile time by using the
 134  C<:shared> attribute: C<my $var :shared;>.
 135  
 136  Due to problems with Perl's prototyping, if you want to share a newly created
 137  reference, you need to use the C<&share([])> and C<&share({})> syntax.
 138  
 139  The only values that can be assigned to a shared scalar are other scalar
 140  values, or shared refs:
 141  
 142    my $var :shared;
 143    $var = 1;              # ok
 144    $var = [];             # error
 145    $var = &share([]);     # ok
 146  
 147  C<share> will traverse up references exactly I<one> level.  C<share(\$a)> is
 148  equivalent to C<share($a)>, while C<share(\\$a)> is not.  This means that you
 149  must create nested shared data structures by first creating individual shared
 150  leaf nodes, and then adding them to a shared hash or array.
 151  
 152    my %hash :shared;
 153    $hash{'meaning'} = &share([]);
 154    $hash{'meaning'}[0] = &share({});
 155    $hash{'meaning'}[0]{'life'} = 42;
 156  
 157  =item is_shared VARIABLE
 158  
 159  C<is_shared> checks if the specified variable is shared or not.  If shared,
 160  returns the variable's internal ID (similar to
 161  L<refaddr()|Scalar::Util/"refaddr EXPR">).  Otherwise, returns C<undef>.
 162  
 163    if (is_shared($var)) {
 164        print("\$var is shared\n");
 165    } else {
 166        print("\$var is not shared\n");
 167    }
 168  
 169  =item lock VARIABLE
 170  
 171  C<lock> places a lock on a variable until the lock goes out of scope.  If the
 172  variable is locked by another thread, the C<lock> call will block until it's
 173  available.  Multiple calls to C<lock> by the same thread from within
 174  dynamically nested scopes are safe -- the variable will remain locked until
 175  the outermost lock on the variable goes out of scope.
 176  
 177  Locking a container object, such as a hash or array, doesn't lock the elements
 178  of that container. For example, if a thread does a C<lock(@a)>, any other
 179  thread doing a C<lock($a[12])> won't block.
 180  
 181  C<lock()> follows references exactly I<one> level.  C<lock(\$a)> is equivalent
 182  to C<lock($a)>, while C<lock(\\$a)> is not.
 183  
 184  Note that you cannot explicitly unlock a variable; you can only wait for the
 185  lock to go out of scope.  This is most easily accomplished by locking the
 186  variable inside a block.
 187  
 188    my $var :shared;
 189    {
 190        lock($var);
 191        # $var is locked from here to the end of the block
 192        ...
 193    }
 194    # $var is now unlocked
 195  
 196  If you need more fine-grained control over shared variable access, see
 197  L<Thread::Semaphore>.
 198  
 199  =item cond_wait VARIABLE
 200  
 201  =item cond_wait CONDVAR, LOCKVAR
 202  
 203  The C<cond_wait> function takes a B<locked> variable as a parameter, unlocks
 204  the variable, and blocks until another thread does a C<cond_signal> or
 205  C<cond_broadcast> for that same locked variable.  The variable that
 206  C<cond_wait> blocked on is relocked after the C<cond_wait> is satisfied.  If
 207  there are multiple threads C<cond_wait>ing on the same variable, all but one
 208  will re-block waiting to reacquire the lock on the variable. (So if you're only
 209  using C<cond_wait> for synchronisation, give up the lock as soon as possible).
 210  The two actions of unlocking the variable and entering the blocked wait state
 211  are atomic, the two actions of exiting from the blocked wait state and
 212  re-locking the variable are not.
 213  
 214  In its second form, C<cond_wait> takes a shared, B<unlocked> variable followed
 215  by a shared, B<locked> variable.  The second variable is unlocked and thread
 216  execution suspended until another thread signals the first variable.
 217  
 218  It is important to note that the variable can be notified even if no thread
 219  C<cond_signal> or C<cond_broadcast> on the variable.  It is therefore
 220  important to check the value of the variable and go back to waiting if the
 221  requirement is not fulfilled.  For example, to pause until a shared counter
 222  drops to zero:
 223  
 224    { lock($counter); cond_wait($count) until $counter == 0; }
 225  
 226  =item cond_timedwait VARIABLE, ABS_TIMEOUT
 227  
 228  =item cond_timedwait CONDVAR, ABS_TIMEOUT, LOCKVAR
 229  
 230  In its two-argument form, C<cond_timedwait> takes a B<locked> variable and an
 231  absolute timeout as parameters, unlocks the variable, and blocks until the
 232  timeout is reached or another thread signals the variable.  A false value is
 233  returned if the timeout is reached, and a true value otherwise.  In either
 234  case, the variable is re-locked upon return.
 235  
 236  Like C<cond_wait>, this function may take a shared, B<locked> variable as an
 237  additional parameter; in this case the first parameter is an B<unlocked>
 238  condition variable protected by a distinct lock variable.
 239  
 240  Again like C<cond_wait>, waking up and reacquiring the lock are not atomic,
 241  and you should always check your desired condition after this function
 242  returns.  Since the timeout is an absolute value, however, it does not have to
 243  be recalculated with each pass:
 244  
 245    lock($var);
 246    my $abs = time() + 15;
 247    until ($ok = desired_condition($var)) {
 248        last if !cond_timedwait($var, $abs);
 249    }
 250    # we got it if $ok, otherwise we timed out!
 251  
 252  =item cond_signal VARIABLE
 253  
 254  The C<cond_signal> function takes a B<locked> variable as a parameter and
 255  unblocks one thread that's C<cond_wait>ing on that variable. If more than one
 256  thread is blocked in a C<cond_wait> on that variable, only one (and which one
 257  is indeterminate) will be unblocked.
 258  
 259  If there are no threads blocked in a C<cond_wait> on the variable, the signal
 260  is discarded. By always locking before signaling, you can (with care), avoid
 261  signaling before another thread has entered cond_wait().
 262  
 263  C<cond_signal> will normally generate a warning if you attempt to use it on an
 264  unlocked variable. On the rare occasions where doing this may be sensible, you
 265  can suppress the warning with:
 266  
 267    { no warnings 'threads'; cond_signal($foo); }
 268  
 269  =item cond_broadcast VARIABLE
 270  
 271  The C<cond_broadcast> function works similarly to C<cond_signal>.
 272  C<cond_broadcast>, though, will unblock B<all> the threads that are blocked in
 273  a C<cond_wait> on the locked variable, rather than only one.
 274  
 275  =back
 276  
 277  =head1 OBJECTS
 278  
 279  L<threads::shared> exports a version of L<bless()|perlfunc/"bless REF"> that
 280  works on shared objects such that I<blessings> propagate across threads.
 281  
 282    # Create a shared 'foo' object
 283    my $foo;
 284    share($foo);
 285    $foo = &share({});
 286    bless($foo, 'foo');
 287  
 288    # Create a shared 'bar' object
 289    my $bar;
 290    share($bar);
 291    $bar = &share({});
 292    bless($bar, 'bar');
 293  
 294    # Put 'bar' inside 'foo'
 295    $foo->{'bar'} = $bar;
 296  
 297    # Rebless the objects via a thread
 298    threads->create(sub {
 299        # Rebless the outer object
 300        bless($foo, 'yin');
 301  
 302        # Cannot directly rebless the inner object
 303        #bless($foo->{'bar'}, 'yang');
 304  
 305        # Retrieve and rebless the inner object
 306        my $obj = $foo->{'bar'};
 307        bless($obj, 'yang');
 308        $foo->{'bar'} = $obj;
 309  
 310    })->join();
 311  
 312    print(ref($foo),          "\n");    # Prints 'yin'
 313    print(ref($foo->{'bar'}), "\n");    # Prints 'yang'
 314    print(ref($bar),          "\n");    # Also prints 'yang'
 315  
 316  =head1 NOTES
 317  
 318  threads::shared is designed to disable itself silently if threads are not
 319  available. If you want access to threads, you must C<use threads> before you
 320  C<use threads::shared>.  L<threads> will emit a warning if you use it after
 321  L<threads::shared>.
 322  
 323  =head1 BUGS AND LIMITATIONS
 324  
 325  When C<share> is used on arrays, hashes, array refs or hash refs, any data
 326  they contain will be lost.
 327  
 328    my @arr = qw(foo bar baz);
 329    share(@arr);
 330    # @arr is now empty (i.e., == ());
 331  
 332    # Create a 'foo' object
 333    my $foo = { 'data' => 99 };
 334    bless($foo, 'foo');
 335  
 336    # Share the object
 337    share($foo);        # Contents are now wiped out
 338    print("ERROR: \$foo is empty\n")
 339        if (! exists($foo->{'data'}));
 340  
 341  Therefore, populate such variables B<after> declaring them as shared.  (Scalar
 342  and scalar refs are not affected by this problem.)
 343  
 344  It is often not wise to share an object unless the class itself has been
 345  written to support sharing.  For example, an object's destructor may get
 346  called multiple times, once for each thread's scope exit.  Another danger is
 347  that the contents of hash-based objects will be lost due to the above
 348  mentioned limitation.  See F<examples/class.pl> (in the CPAN distribution of
 349  this module) for how to create a class that supports object sharing.
 350  
 351  Does not support C<splice> on arrays!
 352  
 353  Taking references to the elements of shared arrays and hashes does not
 354  autovivify the elements, and neither does slicing a shared array/hash over
 355  non-existent indices/keys autovivify the elements.
 356  
 357  C<share()> allows you to C<< share($hashref->{key}) >> without giving any
 358  error message.  But the C<< $hashref->{key} >> is B<not> shared, causing the
 359  error "locking can only be used on shared values" to occur when you attempt to
 360  C<< lock($hasref->{key}) >>.
 361  
 362  View existing bug reports at, and submit any new bugs, problems, patches, etc.
 363  to: L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=threads-shared>
 364  
 365  =head1 SEE ALSO
 366  
 367  L<threads::shared> Discussion Forum on CPAN:
 368  L<http://www.cpanforum.com/dist/threads-shared>
 369  
 370  Annotated POD for L<threads::shared>:
 371  L<http://annocpan.org/~JDHEDDEN/threads-shared-1.14/shared.pm>
 372  
 373  Source repository:
 374  L<http://code.google.com/p/threads-shared/>
 375  
 376  L<threads>, L<perlthrtut>
 377  
 378  L<http://www.perl.com/pub/a/2002/06/11/threads.html> and
 379  L<http://www.perl.com/pub/a/2002/09/04/threads.html>
 380  
 381  Perl threads mailing list:
 382  L<http://lists.cpan.org/showlist.cgi?name=iThreads>
 383  
 384  =head1 AUTHOR
 385  
 386  Artur Bergman E<lt>sky AT crucially DOT netE<gt>
 387  
 388  threads::shared is released under the same license as Perl.
 389  
 390  Documentation borrowed from the old Thread.pm.
 391  
 392  CPAN version produced by Jerry D. Hedden E<lt>jdhedden AT cpan DOT orgE<gt>.
 393  
 394  =cut


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1