summaryrefslogtreecommitdiffstats
path: root/man3p/pthread_cond_wait.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man3p/pthread_cond_wait.3p')
-rw-r--r--man3p/pthread_cond_wait.3p335
1 files changed, 335 insertions, 0 deletions
diff --git a/man3p/pthread_cond_wait.3p b/man3p/pthread_cond_wait.3p
new file mode 100644
index 000000000..a1bee1a85
--- /dev/null
+++ b/man3p/pthread_cond_wait.3p
@@ -0,0 +1,335 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "PTHREAD_COND_TIMEDWAIT" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" pthread_cond_timedwait
+.SH NAME
+pthread_cond_timedwait, pthread_cond_wait \- wait on a condition
+.SH SYNOPSIS
+.LP
+\fB#include <pthread.h>
+.br
+.sp
+int pthread_cond_timedwait(pthread_cond_t *restrict\fP \fIcond\fP\fB,
+.br
+\ \ \ \ \ \ pthread_mutex_t *restrict\fP \fImutex\fP\fB,
+.br
+\ \ \ \ \ \ const struct timespec *restrict\fP \fIabstime\fP\fB);
+.br
+int pthread_cond_wait(pthread_cond_t *restrict\fP \fIcond\fP\fB,
+.br
+\ \ \ \ \ \ pthread_mutex_t *restrict\fP \fImutex\fP\fB); \fP
+\fB
+.br
+\fP
+.SH DESCRIPTION
+.LP
+The \fIpthread_cond_timedwait\fP() and \fIpthread_cond_wait\fP() functions
+shall block on a condition variable. They shall be
+called with \fImutex\fP locked by the calling thread or undefined
+behavior results.
+.LP
+These functions atomically release \fImutex\fP and cause the calling
+thread to block on the condition variable \fIcond\fP;
+atomically here means "atomically with respect to access by another
+thread to the mutex and then the condition variable". That
+is, if another thread is able to acquire the mutex after the about-to-block
+thread has released it, then a subsequent call to \fIpthread_cond_broadcast\fP()
+or \fIpthread_cond_signal\fP() in that thread shall behave as if it
+were issued after the
+about-to-block thread has blocked.
+.LP
+Upon successful return, the mutex shall have been locked and shall
+be owned by the calling thread.
+.LP
+When using condition variables there is always a Boolean predicate
+involving shared variables associated with each condition
+wait that is true if the thread should proceed. Spurious wakeups from
+the \fIpthread_cond_timedwait\fP() or
+\fIpthread_cond_wait\fP() functions may occur. Since the return from
+\fIpthread_cond_timedwait\fP() or \fIpthread_cond_wait\fP()
+does not imply anything about the value of this predicate, the predicate
+should be re-evaluated upon such return.
+.LP
+The effect of using more than one mutex for concurrent \fIpthread_cond_timedwait\fP()
+or \fIpthread_cond_wait\fP() operations
+on the same condition variable is undefined; that is, a condition
+variable becomes bound to a unique mutex when a thread waits on
+the condition variable, and this (dynamic) binding shall end when
+the wait returns.
+.LP
+A condition wait (whether timed or not) is a cancellation point. When
+the cancelability enable state of a thread is set to
+PTHREAD_CANCEL_DEFERRED, a side effect of acting upon a cancellation
+request while in a condition wait is that the mutex is (in
+effect) re-acquired before calling the first cancellation cleanup
+handler. The effect is as if the thread were unblocked, allowed
+to execute up to the point of returning from the call to \fIpthread_cond_timedwait\fP()
+or \fIpthread_cond_wait\fP(), but at that
+point notices the cancellation request and instead of returning to
+the caller of \fIpthread_cond_timedwait\fP() or
+\fIpthread_cond_wait\fP(), starts the thread cancellation activities,
+which includes calling cancellation cleanup handlers.
+.LP
+A thread that has been unblocked because it has been canceled while
+blocked in a call to \fIpthread_cond_timedwait\fP() or
+\fIpthread_cond_wait\fP() shall not consume any condition signal that
+may be directed concurrently at the condition variable if
+there are other threads blocked on the condition variable.
+.LP
+The \fIpthread_cond_timedwait\fP() function shall be equivalent to
+\fIpthread_cond_wait\fP(), except that an error is returned
+if the absolute time specified by \fIabstime\fP passes (that is, system
+time equals or exceeds \fIabstime\fP) before the
+condition \fIcond\fP is signaled or broadcasted, or if the absolute
+time specified by \fIabstime\fP has already been passed at
+the time of the call.
+.LP
+If
+the Clock Selection option is supported, the condition variable shall
+have a clock attribute which specifies the clock that shall
+be used to measure the time specified by the \fIabstime\fP argument.
+When such timeouts occur, \fIpthread_cond_timedwait\fP() shall nonetheless
+release and re-acquire the mutex referenced by
+\fImutex\fP. The \fIpthread_cond_timedwait\fP() function is also a
+cancellation point.
+.LP
+If a signal is delivered to a thread waiting for a condition variable,
+upon return from the signal handler the thread resumes
+waiting for the condition variable as if it was not interrupted, or
+it shall return zero due to spurious wakeup.
+.SH RETURN VALUE
+.LP
+Except in the case of [ETIMEDOUT], all these error checks shall act
+as if they were performed immediately at the beginning of
+processing for the function and shall cause an error return, in effect,
+prior to modifying the state of the mutex specified by
+\fImutex\fP or the condition variable specified by \fIcond\fP.
+.LP
+Upon successful completion, a value of zero shall be returned; otherwise,
+an error number shall be returned to indicate the
+error.
+.SH ERRORS
+.LP
+The \fIpthread_cond_timedwait\fP() function shall fail if:
+.TP 7
+.B ETIMEDOUT
+The time specified by \fIabstime\fP to \fIpthread_cond_timedwait\fP()
+has passed.
+.sp
+.LP
+The \fIpthread_cond_timedwait\fP() and \fIpthread_cond_wait\fP() functions
+may fail if:
+.TP 7
+.B EINVAL
+The value specified by \fIcond\fP, \fImutex\fP, or \fIabstime\fP is
+invalid.
+.TP 7
+.B EINVAL
+Different mutexes were supplied for concurrent \fIpthread_cond_timedwait\fP()
+or \fIpthread_cond_wait\fP() operations on the
+same condition variable.
+.TP 7
+.B EPERM
+The mutex was not owned by the current thread at the time of the call.
+.sp
+.LP
+These functions shall not return an error code of [EINTR].
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.SS Condition Wait Semantics
+.LP
+It is important to note that when \fIpthread_cond_wait\fP() and \fIpthread_cond_timedwait\fP()
+return without error, the
+associated predicate may still be false. Similarly, when \fIpthread_cond_timedwait\fP()
+returns with the timeout error, the
+associated predicate may be true due to an unavoidable race between
+the expiration of the timeout and the predicate state
+change.
+.LP
+Some implementations, particularly on a multi-processor, may sometimes
+cause multiple threads to wake up when the condition
+variable is signaled simultaneously on different processors.
+.LP
+In general, whenever a condition wait returns, the thread has to re-evaluate
+the predicate associated with the condition wait to
+determine whether it can safely proceed, should wait again, or should
+declare a timeout. A return from the wait does not imply that
+the associated predicate is either true or false.
+.LP
+It is thus recommended that a condition wait be enclosed in the equivalent
+of a "while loop" that checks the predicate.
+.SS Timed Wait Semantics
+.LP
+An absolute time measure was chosen for specifying the timeout parameter
+for two reasons. First, a relative time measure can be
+easily implemented on top of a function that specifies absolute time,
+but there is a race condition associated with specifying an
+absolute timeout on top of a function that specifies relative timeouts.
+For example, assume that \fIclock_gettime\fP() returns the current
+time and \fIcond_relative_timed_wait\fP() uses
+relative timeouts:
+.sp
+.RS
+.nf
+
+\fBclock_gettime(CLOCK_REALTIME, &now)
+reltime = sleep_til_this_absolute_time -now;
+cond_relative_timed_wait(c, m, &reltime);
+\fP
+.fi
+.RE
+.LP
+If the thread is preempted between the first statement and the last
+statement, the thread blocks for too long. Blocking,
+however, is irrelevant if an absolute timeout is used. An absolute
+timeout also need not be recomputed if it is used multiple times
+in a loop, such as that enclosing a condition wait.
+.LP
+For cases when the system clock is advanced discontinuously by an
+operator, it is expected that implementations process any
+timed wait expiring at an intervening time as if that time had actually
+occurred.
+.SS Cancellation and Condition Wait
+.LP
+A condition wait, whether timed or not, is a cancellation point. That
+is, the functions \fIpthread_cond_wait\fP() or
+\fIpthread_cond_timedwait\fP() are points where a pending (or concurrent)
+cancellation request is noticed. The reason for this is
+that an indefinite wait is possible at these points-whatever event
+is being waited for, even if the program is totally correct,
+might never occur; for example, some input data being awaited might
+never be sent. By making condition wait a cancellation point,
+the thread can be canceled and perform its cancellation cleanup handler
+even though it may be stuck in some indefinite wait.
+.LP
+A side effect of acting on a cancellation request while a thread is
+blocked on a condition variable is to re-acquire the mutex
+before calling any of the cancellation cleanup handlers. This is done
+in order to ensure that the cancellation cleanup handler is
+executed in the same state as the critical code that lies both before
+and after the call to the condition wait function. This rule
+is also required when interfacing to POSIX threads from languages,
+such as Ada or C++, which may choose to map cancellation onto a
+language exception; this rule ensures that each exception handler
+guarding a critical section can always safely depend upon the
+fact that the associated mutex has already been locked regardless
+of exactly where within the critical section the exception was
+raised. Without this rule, there would not be a uniform rule that
+exception handlers could follow regarding the lock, and so coding
+would become very cumbersome.
+.LP
+Therefore, since \fIsome\fP statement has to be made regarding the
+state of the lock when a cancellation is delivered during a
+wait, a definition has been chosen that makes application coding most
+convenient and error free.
+.LP
+When acting on a cancellation request while a thread is blocked on
+a condition variable, the implementation is required to
+ensure that the thread does not consume any condition signals directed
+at that condition variable if there are any other threads
+waiting on that condition variable. This rule is specified in order
+to avoid deadlock conditions that could occur if these two
+independent requests (one acting on a thread and the other acting
+on the condition variable) were not processed independently.
+.SS Performance of Mutexes and Condition Variables
+.LP
+Mutexes are expected to be locked only for a few instructions. This
+practice is almost automatically enforced by the desire of
+programmers to avoid long serial regions of execution (which would
+reduce total effective parallelism).
+.LP
+When using mutexes and condition variables, one tries to ensure that
+the usual case is to lock the mutex, access shared data,
+and unlock the mutex. Waiting on a condition variable should be a
+relatively rare situation. For example, when implementing a
+read-write lock, code that acquires a read-lock typically needs only
+to increment the count of readers (under mutual-exclusion) and
+return. The calling thread would actually wait on the condition variable
+only when there is already an active writer. So the
+efficiency of a synchronization operation is bounded by the cost of
+mutex lock/unlock and not by condition wait. Note that in the
+usual case there is no context switch.
+.LP
+This is not to say that the efficiency of condition waiting is unimportant.
+Since there needs to be at least one context switch
+per Ada rendezvous, the efficiency of waiting on a condition variable
+is important. The cost of waiting on a condition variable
+should be little more than the minimal cost for a context switch plus
+the time to unlock and lock the mutex.
+.SS Features of Mutexes and Condition Variables
+.LP
+It had been suggested that the mutex acquisition and release be decoupled
+from condition wait. This was rejected because it is
+the combined nature of the operation that, in fact, facilitates realtime
+implementations. Those implementations can atomically move
+a high-priority thread between the condition variable and the mutex
+in a manner that is transparent to the caller. This can prevent
+extra context switches and provide more deterministic acquisition
+of a mutex when the waiting thread is signaled. Thus, fairness
+and priority issues can be dealt with directly by the scheduling discipline.
+Furthermore, the current condition wait operation
+matches existing practice.
+.SS Scheduling Behavior of Mutexes and Condition Variables
+.LP
+Synchronization primitives that attempt to interfere with scheduling
+policy by specifying an ordering rule are considered
+undesirable. Threads waiting on mutexes and condition variables are
+selected to proceed in an order dependent upon the scheduling
+policy rather than in some fixed order (for example, FIFO or priority).
+Thus, the scheduling policy determines which thread(s) are
+awakened and allowed to proceed.
+.SS Timed Condition Wait
+.LP
+The \fIpthread_cond_timedwait\fP() function allows an application
+to give up waiting for a particular condition after a given
+amount of time. An example of its use follows:
+.sp
+.RS
+.nf
+
+\fB(void) pthread_mutex_lock(&t.mn);
+ t.waiters++;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ ts.tv_sec += 5;
+ rc = 0;
+ while (! mypredicate(&t) && rc == 0)
+ rc = pthread_cond_timedwait(&t.cond, &t.mn, &ts);
+ t.waiters--;
+ if (rc == 0) setmystate(&t);
+(void) pthread_mutex_unlock(&t.mn);
+\fP
+.fi
+.RE
+.LP
+By making the timeout parameter absolute, it does not need to be recomputed
+each time the program checks its blocking predicate.
+If the timeout was relative, it would have to be recomputed before
+each call. This would be especially difficult since such code
+would need to take into account the possibility of extra wakeups that
+result from extra broadcasts or signals on the condition
+variable that occur before either the predicate is true or the timeout
+is due.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIpthread_cond_signal\fP() , \fIpthread_cond_broadcast\fP() , the
+Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<pthread.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .