1994-01-02 01:22:07 +00:00
|
|
|
\section{Built-in Module \sectcode{thread}}
|
|
|
|
\bimodindex{thread}
|
|
|
|
|
|
|
|
This module provides low-level primitives for working with multiple
|
1995-03-13 10:03:32 +00:00
|
|
|
threads (a.k.a.\ \dfn{light-weight processes} or \dfn{tasks}) --- multiple
|
1994-01-02 01:22:07 +00:00
|
|
|
threads of control sharing their global data space. For
|
1995-03-13 10:03:32 +00:00
|
|
|
synchronization, simple locks (a.k.a.\ \dfn{mutexes} or \dfn{binary
|
1994-01-02 01:22:07 +00:00
|
|
|
semaphores}) are provided.
|
|
|
|
|
1994-08-12 13:13:50 +00:00
|
|
|
The module is optional and supported on SGI IRIX 4.x and 5.x and Sun
|
|
|
|
Solaris 2.x systems, as well as on systems that have a PTHREAD
|
1995-03-13 10:03:32 +00:00
|
|
|
implementation (e.g.\ KSR).
|
1994-01-02 01:22:07 +00:00
|
|
|
|
|
|
|
It defines the following constant and functions:
|
|
|
|
|
|
|
|
\renewcommand{\indexsubitem}{(in module thread)}
|
|
|
|
\begin{excdesc}{error}
|
|
|
|
Raised on thread-specific errors.
|
|
|
|
\end{excdesc}
|
|
|
|
|
|
|
|
\begin{funcdesc}{start_new_thread}{func\, arg}
|
|
|
|
Start a new thread. The thread executes the function \var{func}
|
|
|
|
with the argument list \var{arg} (which must be a tuple). When the
|
1995-03-13 10:03:32 +00:00
|
|
|
function returns, the thread silently exits. When the function
|
1994-01-02 01:22:07 +00:00
|
|
|
terminates with an unhandled exception, a stack trace is printed and
|
|
|
|
then the thread exits (but other threads continue to run).
|
|
|
|
\end{funcdesc}
|
|
|
|
|
|
|
|
\begin{funcdesc}{exit_thread}{}
|
|
|
|
Exit the current thread silently. Other threads continue to run.
|
|
|
|
\strong{Caveat:} code in pending \code{finally} clauses is not executed.
|
|
|
|
\end{funcdesc}
|
|
|
|
|
|
|
|
\begin{funcdesc}{exit_prog}{status}
|
|
|
|
Exit all threads and report the value of the integer argument
|
|
|
|
\var{status} as the exit status of the entire program.
|
|
|
|
\strong{Caveat:} code in pending \code{finally} clauses, in this thread
|
|
|
|
or in other threads, is not executed.
|
|
|
|
\end{funcdesc}
|
|
|
|
|
|
|
|
\begin{funcdesc}{allocate_lock}{}
|
|
|
|
Return a new lock object. Methods of locks are described below. The
|
|
|
|
lock is initially unlocked.
|
|
|
|
\end{funcdesc}
|
|
|
|
|
1994-08-12 13:13:50 +00:00
|
|
|
\begin{funcdesc}{get_ident}{}
|
|
|
|
Return the `thread identifier' of the current thread. This is a
|
|
|
|
nonzero integer. Its value has no direct meaning; it is intended as a
|
|
|
|
magic cookie to be used e.g. to index a dictionary of thread-specific
|
|
|
|
data. Thread identifiers may be recycled when a thread exits and
|
|
|
|
another thread is created.
|
|
|
|
\end{funcdesc}
|
|
|
|
|
1994-01-02 01:22:07 +00:00
|
|
|
Lock objects have the following methods:
|
|
|
|
|
|
|
|
\renewcommand{\indexsubitem}{(lock method)}
|
|
|
|
\begin{funcdesc}{acquire}{waitflag}
|
|
|
|
Without the optional argument, this method acquires the lock
|
|
|
|
unconditionally, if necessary waiting until it is released by another
|
|
|
|
thread (only one thread at a time can acquire a lock --- that's their
|
|
|
|
reason for existence), and returns \code{None}. If the integer
|
1995-03-13 10:03:32 +00:00
|
|
|
\var{waitflag} argument is present, the action depends on its value:\
|
1994-01-02 01:22:07 +00:00
|
|
|
if it is zero, the lock is only acquired if it can be acquired
|
|
|
|
immediately without waiting, while if it is nonzero, the lock is
|
|
|
|
acquired unconditionally as before. If an argument is present, the
|
|
|
|
return value is 1 if the lock is acquired successfully, 0 if not.
|
|
|
|
\end{funcdesc}
|
|
|
|
|
|
|
|
\begin{funcdesc}{release}{}
|
|
|
|
Releases the lock. The lock must have been acquired earlier, but not
|
|
|
|
necessarily by the same thread.
|
|
|
|
\end{funcdesc}
|
|
|
|
|
|
|
|
\begin{funcdesc}{locked}{}
|
1995-03-13 10:03:32 +00:00
|
|
|
Return the status of the lock:\ 1 if it has been acquired by some
|
1994-01-02 01:22:07 +00:00
|
|
|
thread, 0 if not.
|
|
|
|
\end{funcdesc}
|
|
|
|
|
|
|
|
{\bf Caveats:}
|
|
|
|
|
|
|
|
\begin{itemize}
|
|
|
|
\item
|
|
|
|
Threads interact strangely with interrupts: the
|
|
|
|
\code{KeyboardInterrupt} exception will be received by an arbitrary
|
|
|
|
thread.
|
|
|
|
|
|
|
|
\item
|
|
|
|
Calling \code{sys.exit(\var{status})} or executing
|
|
|
|
\code{raise SystemExit, \var{status}} is almost equivalent to calling
|
|
|
|
\code{thread.exit_prog(\var{status})}, except that the former ways of
|
|
|
|
exiting the entire program do honor \code{finally} clauses in the
|
|
|
|
current thread (but not in other threads).
|
|
|
|
|
|
|
|
\item
|
|
|
|
Not all built-in functions that may block waiting for I/O allow other
|
|
|
|
threads to run, although the most popular ones (\code{sleep},
|
|
|
|
\code{read}, \code{select}) work as expected.
|
|
|
|
|
|
|
|
\end{itemize}
|