Clean up mktables intro comments; remove trailing white space
[p5sagit/p5-mst-13.2.git] / lib / Thread.pm
CommitLineData
43d3ddbe 1package Thread;
2
4038bebf 3use strict;
9f015efb 4use warnings;
014e6b2c 5no warnings 'redefine';
4038bebf 6
014e6b2c 7our $VERSION = '3.02';
9f015efb 8$VERSION = eval $VERSION;
4038bebf 9
43d3ddbe 10BEGIN {
11 use Config;
9f015efb 12 if (! $Config{useithreads}) {
13 die("This Perl not built to support threads\n");
14 }
43d3ddbe 15}
16
9f015efb 17use threads 'yield';
18use threads::shared;
19
43d3ddbe 20require Exporter;
9f015efb 21our @ISA = qw(Exporter threads);
22our @EXPORT = qw(cond_wait cond_broadcast cond_signal);
23our @EXPORT_OK = qw(async yield);
43d3ddbe 24
014e6b2c 25sub async (&;@) { return Thread->new(shift); }
43d3ddbe 26
9f015efb 27sub done { return ! shift->is_running(); }
43d3ddbe 28
9f015efb 29sub eval { die("'eval' not implemented with 'ithreads'\n"); };
30sub flags { die("'flags' not implemented with 'ithreads'\n"); };
31
321;
43d3ddbe 33
9f015efb 34__END__
43d3ddbe 35
9f015efb 36=head1 NAME
43d3ddbe 37
9f015efb 38Thread - Manipulate threads in Perl (for old code only)
43d3ddbe 39
9f015efb 40=head1 DEPRECATED
43d3ddbe 41
9f015efb 42The C<Thread> module served as the frontend to the old-style thread model,
43called I<5005threads>, that was introduced in release 5.005. That model was
44deprecated, and has been removed in version 5.10.
43d3ddbe 45
9f015efb 46For old code and interim backwards compatibility, the C<Thread> module has
47been reworked to function as a frontend for the new interpreter threads
48(I<ithreads>) model. However, some previous functionality is not available.
49Further, the data sharing models between the two thread models are completely
50different, and anything to do with data sharing has to be thought differently.
51With I<ithreads>, you must explicitly C<share()> variables between the
52threads.
43d3ddbe 53
9f015efb 54You are strongly encouraged to migrate any existing threaded code to the new
55model (i.e., use the C<threads> and C<threads::shared> modules) as soon as
56possible.
43d3ddbe 57
9f015efb 58=head1 HISTORY
9d40afd1 59
9f015efb 60In Perl 5.005, the thread model was that all data is implicitly shared, and
61shared access to data has to be explicitly synchronized. This model is called
62I<5005threads>.
8a20485c 63
9f015efb 64In Perl 5.6, a new model was introduced in which all is was thread local and
65shared access to data has to be explicitly declared. This model is called
66I<ithreads>, for "interpreter threads".
43d3ddbe 67
9f015efb 68In Perl 5.6, the I<ithreads> model was not available as a public API; only as
69an internal API that was available for extension writers, and to implement
70fork() emulation on Win32 platforms.
43d3ddbe 71
9f015efb 72In Perl 5.8, the I<ithreads> model became available through the C<threads>
73module, and the I<5005threads> model was deprecated.
8a20485c 74
9f015efb 75In Perl 5.10, the I<5005threads> model was removed from the Perl interpreter.
43d3ddbe 76
77=head1 SYNOPSIS
78
9d40afd1 79 use Thread qw(:DEFAULT async yield);
43d3ddbe 80
81 my $t = Thread->new(\&start_sub, @start_args);
82
83 $result = $t->join;
43d3ddbe 84 $t->detach;
85
86 if ($t->done) {
87 $t->join;
88 }
89
90 if($t->equal($another_thread)) {
9d40afd1 91 # ...
43d3ddbe 92 }
93
94 yield();
95
9d40afd1 96 my $tid = Thread->self->tid;
43d3ddbe 97
98 lock($scalar);
99 lock(@array);
100 lock(%hash);
101
9d40afd1 102 my @list = Thread->list;
43d3ddbe 103
104=head1 DESCRIPTION
105
9f015efb 106The C<Thread> module provides multithreading support for Perl.
43d3ddbe 107
108=head1 FUNCTIONS
109
110=over 8
111
112=item $thread = Thread->new(\&start_sub)
113
114=item $thread = Thread->new(\&start_sub, LIST)
115
116C<new> starts a new thread of execution in the referenced subroutine. The
117optional list is passed as parameters to the subroutine. Execution
118continues in both the subroutine and the code after the C<new> call.
119
120C<Thread-&gt;new> returns a thread object representing the newly created
121thread.
122
123=item lock VARIABLE
124
dfca11dd 125C<lock> places a lock on a variable until the lock goes out of scope.
43d3ddbe 126
127If the variable is locked by another thread, the C<lock> call will
128block until it's available. C<lock> is recursive, so multiple calls
129to C<lock> are safe--the variable will remain locked until the
130outermost lock on the variable goes out of scope.
131
132Locks on variables only affect C<lock> calls--they do I<not> affect normal
133access to a variable. (Locks on subs are different, and covered in a bit.)
134If you really, I<really> want locks to block access, then go ahead and tie
135them to something and manage this yourself. This is done on purpose.
136While managing access to variables is a good thing, Perl doesn't force
137you out of its living room...
138
139If a container object, such as a hash or array, is locked, all the
140elements of that container are not locked. For example, if a thread
141does a C<lock @a>, any other thread doing a C<lock($a[12])> won't
142block.
143
43d3ddbe 144Finally, C<lock> will traverse up references exactly I<one> level.
145C<lock(\$a)> is equivalent to C<lock($a)>, while C<lock(\\$a)> is not.
146
147=item async BLOCK;
148
149C<async> creates a thread to execute the block immediately following
150it. This block is treated as an anonymous sub, and so must have a
151semi-colon after the closing brace. Like C<Thread-&gt;new>, C<async>
152returns a thread object.
153
154=item Thread->self
155
156The C<Thread-E<gt>self> function returns a thread object that represents
157the thread making the C<Thread-E<gt>self> call.
158
9d40afd1 159=item Thread->list
160
161Returns a list of all non-joined, non-detached Thread objects.
162
43d3ddbe 163=item cond_wait VARIABLE
164
165The C<cond_wait> function takes a B<locked> variable as
166a parameter, unlocks the variable, and blocks until another thread
167does a C<cond_signal> or C<cond_broadcast> for that same locked
168variable. The variable that C<cond_wait> blocked on is relocked
169after the C<cond_wait> is satisfied. If there are multiple threads
170C<cond_wait>ing on the same variable, all but one will reblock waiting
171to reaquire the lock on the variable. (So if you're only using
172C<cond_wait> for synchronization, give up the lock as soon as
173possible.)
174
175=item cond_signal VARIABLE
176
177The C<cond_signal> function takes a locked variable as a parameter and
178unblocks one thread that's C<cond_wait>ing on that variable. If more than
179one thread is blocked in a C<cond_wait> on that variable, only one (and
180which one is indeterminate) will be unblocked.
181
182If there are no threads blocked in a C<cond_wait> on the variable,
183the signal is discarded.
184
185=item cond_broadcast VARIABLE
186
187The C<cond_broadcast> function works similarly to C<cond_signal>.
188C<cond_broadcast>, though, will unblock B<all> the threads that are
189blocked in a C<cond_wait> on the locked variable, rather than only
190one.
191
192=item yield
193
194The C<yield> function allows another thread to take control of the
195CPU. The exact results are implementation-dependent.
196
197=back
198
199=head1 METHODS
200
201=over 8
202
203=item join
204
205C<join> waits for a thread to end and returns any values the thread
206exited with. C<join> will block until the thread has ended, though
207it won't block if the thread has already terminated.
208
209If the thread being C<join>ed C<die>d, the error it died with will
210be returned at this time. If you don't want the thread performing
211the C<join> to die as well, you should either wrap the C<join> in
212an C<eval> or use the C<eval> thread method instead of C<join>.
213
43d3ddbe 214=item detach
215
216C<detach> tells a thread that it is never going to be joined i.e.
217that all traces of its existence can be removed once it stops running.
218Errors in detached threads will not be visible anywhere - if you want
219to catch them, you should use $SIG{__DIE__} or something like that.
220
9d40afd1 221=item equal
43d3ddbe 222
223C<equal> tests whether two thread objects represent the same thread and
224returns true if they do.
225
226=item tid
227
228The C<tid> method returns the tid of a thread. The tid is
229a monotonically increasing integer assigned when a thread is
230created. The main thread of a program will have a tid of zero,
231while subsequent threads will have tids assigned starting with one.
232
43d3ddbe 233=item done
234
235The C<done> method returns true if the thread you're checking has
9d40afd1 236finished, and false otherwise.
43d3ddbe 237
238=back
239
9f015efb 240=head1 DEFUNCT
43d3ddbe 241
9f015efb 242The following were implemented with I<5005threads>, but are no longer
243available with I<ithreads>.
43d3ddbe 244
9f015efb 245=over 8
43d3ddbe 246
9f015efb 247=item lock(\&sub)
43d3ddbe 248
9f015efb 249With 5005threads, you could also C<lock> a sub such that any calls to that sub
250from another thread would block until the lock was released.
43d3ddbe 251
9f015efb 252Also, subroutines could be declared with the C<:locked> attribute which would
253serialize access to the subroutine, but allowed different threads
254non-simultaneous access.
43d3ddbe 255
9f015efb 256=item eval
43d3ddbe 257
9f015efb 258The C<eval> method wrapped an C<eval> around a C<join>, and so waited for a
259thread to exit, passing along any values the thread might have returned and
260placing any errors into C<$@>.
43d3ddbe 261
9f015efb 262=item flags
43d3ddbe 263
9f015efb 264The C<flags> method returned the flags for the thread - an integer value
265corresponding to the internal flags for the thread.
43d3ddbe 266
9f015efb 267=back
43d3ddbe 268
9f015efb 269=head1 SEE ALSO
43d3ddbe 270
9f015efb 271L<threads>, L<threads::shared>, L<Thread::Queue>, L<Thread::Semaphore>
43d3ddbe 272
9f015efb 273=cut