package Thread;
-$VERSION = '2.00';
-
use strict;
-our $ithreads;
-our $othreads;
+our($VERSION, $ithreads, $othreads);
BEGIN {
+ $VERSION = '2.00';
use Config;
$ithreads = $Config{useithreads};
$othreads = $Config{use5005threads};
require Exporter;
use XSLoader ();
-our($VERSION, @ISA, @EXPORT, @EXPORT_OK);
+our(@ISA, @EXPORT, @EXPORT_OK);
@ISA = qw(Exporter);
BEGIN {
if ($ithreads) {
- @EXPORT = qw(share cond_wait cond_broadcast cond_signal unlock)
+ @EXPORT = qw(cond_wait cond_broadcast cond_signal)
} elsif ($othreads) {
@EXPORT_OK = qw(cond_signal cond_broadcast cond_wait);
}
=head1 NAME
-Thread - manipulate threads in Perl
+Thread - manipulate threads in Perl (for old code only)
=head1 CAVEAT
variables between the threads.
For new code the use of the C<Thread> module is discouraged and
-the direct use use of the C<threads> and C<threads::shared> modules
+the direct use of the C<threads> and C<threads::shared> modules
is encouraged instead.
Finally, note that there are many known serious problems with the
my @list = Thread->list; # not available with ithreads
- unlock(...); # not available with the 5.005 threads
-
use Thread 'async';
=head1 DESCRIPTION
=item lock VARIABLE
-C<lock> places a lock on a variable until the lock goes out of scope
-(with ithreads you can also explicitly unlock()).
+C<lock> places a lock on a variable until the lock goes out of scope.
If the variable is locked by another thread, the C<lock> call will
block until it's available. C<lock> is recursive, so multiple calls
BEGIN {
if ($ithreads) {
+ if ($othreads) {
+ require Carp;
+ Carp::croak("This Perl has both ithreads and 5005threads (serious malconfiguration)");
+ }
XSLoader::load 'threads';
- for my $m (qw(new join detach yield self tid equal)) {
+ for my $m (qw(new join detach yield self tid equal list)) {
no strict 'refs';
*{"Thread::$m"} = \&{"threads::$m"};
}
- XSLoader::load 'threads::shared';
- for my $m (qw(cond_signal cond_broadcast cond_wait unlock share)) {
+ require 'threads/shared.pm';
+ for my $m (qw(cond_signal cond_broadcast cond_wait)) {
no strict 'refs';
*{"Thread::$m"} = \&{"threads::shared::${m}_enabled"};
}
# trying to unimplement eval gives redefined warning
- unimplement(qw(list done flags));
+ unimplement(qw(done flags));
} elsif ($othreads) {
XSLoader::load 'Thread';
- unimplement(qw(unlock));
} else {
require Carp;
- Carp::croak("This Perl has neither ithreads not 5005threads");
+ Carp::croak("This Perl has neither ithreads nor 5005threads");
}
}