summaryrefslogtreecommitdiffstats
path: root/man-pages-posix-2017/man3p/pthread_cond_timedwait.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man-pages-posix-2017/man3p/pthread_cond_timedwait.3p')
-rw-r--r--man-pages-posix-2017/man3p/pthread_cond_timedwait.3p464
1 files changed, 464 insertions, 0 deletions
diff --git a/man-pages-posix-2017/man3p/pthread_cond_timedwait.3p b/man-pages-posix-2017/man3p/pthread_cond_timedwait.3p
new file mode 100644
index 0000000..6778468
--- /dev/null
+++ b/man-pages-posix-2017/man3p/pthread_cond_timedwait.3p
@@ -0,0 +1,464 @@
+'\" et
+.TH PTHREAD_COND_TIMEDWAIT "3P" 2017 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\"
+.SH PROLOG
+This manual page is part of the POSIX Programmer's Manual.
+The Linux implementation of this interface may differ (consult
+the corresponding Linux manual page for details of Linux behavior),
+or the interface may not be implemented on Linux.
+.\"
+.SH NAME
+pthread_cond_timedwait,
+pthread_cond_wait
+\(em wait on a condition
+.SH SYNOPSIS
+.LP
+.nf
+#include <pthread.h>
+.P
+int pthread_cond_timedwait(pthread_cond_t *restrict \fIcond\fP,
+ pthread_mutex_t *restrict \fImutex\fP,
+ const struct timespec *restrict \fIabstime\fP);
+int pthread_cond_wait(pthread_cond_t *restrict \fIcond\fP,
+ pthread_mutex_t *restrict \fImutex\fP);
+.fi
+.SH DESCRIPTION
+The
+\fIpthread_cond_timedwait\fR()
+and
+\fIpthread_cond_wait\fR()
+functions shall block on a condition variable. The application shall
+ensure that these functions are called with
+.IR mutex
+locked by the calling thread; otherwise, an error (for
+PTHREAD_MUTEX_ERRORCHECK and robust mutexes) or undefined behavior
+(for other mutexes) results.
+.P
+These functions atomically release
+.IR mutex
+and cause the calling thread to block on the condition variable
+.IR cond ;
+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\fR()
+or
+\fIpthread_cond_signal\fR()
+in that thread shall behave as if it were issued after the
+about-to-block thread has blocked.
+.P
+Upon successful return, the mutex shall have been locked and shall be
+owned by the calling thread. If
+.IR mutex
+is a robust mutex where an owner terminated while holding the lock and
+the state is recoverable, the mutex shall be acquired even though the
+function returns an error code.
+.P
+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\fR()
+or
+\fIpthread_cond_wait\fR()
+functions may occur. Since the return from
+\fIpthread_cond_timedwait\fR()
+or
+\fIpthread_cond_wait\fR()
+does not imply anything about the value of this predicate, the
+predicate should be re-evaluated upon such return.
+.P
+When a thread waits on a condition variable, having specified a
+particular mutex to either the
+\fIpthread_cond_timedwait\fR()
+or the
+\fIpthread_cond_wait\fR()
+operation, a dynamic binding is formed between that mutex and condition
+variable that remains in effect as long as at least one thread is
+blocked on the condition variable. During this time, the effect of an
+attempt by any thread to wait on that condition variable using a
+different mutex is undefined. Once all waiting threads have been
+unblocked (as by the
+\fIpthread_cond_broadcast\fR()
+operation), the next wait operation on that condition variable shall
+form a new dynamic binding with the mutex specified by that wait
+operation. Even though the dynamic binding between condition variable
+and mutex may be removed or replaced between the time a thread is
+unblocked from a wait on the condition variable and the time that it
+returns to the caller or begins cancellation cleanup, the unblocked
+thread shall always re-acquire the mutex specified in the condition
+wait operation call from which it is returning.
+.P
+A condition wait (whether timed or not) is a cancellation point. When
+the cancelability type 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\fR()
+or
+\fIpthread_cond_wait\fR(),
+but at that point notices the cancellation request and instead of
+returning to the caller of
+\fIpthread_cond_timedwait\fR()
+or
+\fIpthread_cond_wait\fR(),
+starts the thread cancellation activities, which includes calling
+cancellation cleanup handlers.
+.P
+A thread that has been unblocked because it has been canceled while
+blocked in a call to
+\fIpthread_cond_timedwait\fR()
+or
+\fIpthread_cond_wait\fR()
+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.
+.P
+The
+\fIpthread_cond_timedwait\fR()
+function shall be equivalent to
+\fIpthread_cond_wait\fR(),
+except that an error is returned if the absolute time specified by
+.IR abstime
+passes (that is, system time equals or exceeds
+.IR abstime )
+before the condition
+.IR cond
+is signaled or broadcasted, or if the absolute time specified by
+.IR abstime
+has already been passed at the time of the call. When such timeouts
+occur,
+\fIpthread_cond_timedwait\fR()
+shall nonetheless release and re-acquire the mutex referenced by
+.IR mutex ,
+and may consume a condition signal directed concurrently at the condition
+variable.
+.P
+The condition variable shall have a clock attribute which specifies
+the clock that shall be used to measure the time specified by the
+.IR abstime
+argument. The
+\fIpthread_cond_timedwait\fR()
+function is also a cancellation point.
+.P
+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.
+.P
+The behavior is undefined if the value specified by the
+.IR cond
+or
+.IR mutex
+argument to these functions does not refer to an initialized
+condition variable or an initialized mutex object, respectively.
+.SH "RETURN VALUE"
+Except for
+.BR [ETIMEDOUT] ,
+.BR [ENOTRECOVERABLE] ,
+and
+.BR [EOWNERDEAD] ,
+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
+.IR mutex
+or the condition variable specified by
+.IR cond .
+.P
+Upon successful completion, a value of zero shall be returned; otherwise,
+an error number shall be returned to indicate the error.
+.SH ERRORS
+These functions shall fail if:
+.TP
+.BR ENOTRECOVERABLE
+.br
+The state protected by the mutex is not recoverable.
+.TP
+.BR EOWNERDEAD
+.br
+The mutex is a robust mutex and the process containing the previous
+owning thread terminated while holding the mutex lock. The mutex lock
+shall be acquired by the calling thread and it is up to the new owner
+to make the state consistent.
+.TP
+.BR EPERM
+The mutex type is PTHREAD_MUTEX_ERRORCHECK or the mutex
+is a robust mutex, and the current thread does not own the mutex.
+.P
+The
+\fIpthread_cond_timedwait\fR()
+function shall fail if:
+.TP
+.BR ETIMEDOUT
+The time specified by
+.IR abstime
+to
+\fIpthread_cond_timedwait\fR()
+has passed.
+.TP
+.BR EINVAL
+The
+.IR abstime
+argument specified a nanosecond value less than zero or greater than
+or equal to 1000 million.
+.br
+.P
+These functions may fail if:
+.TP
+.BR EOWNERDEAD
+.br
+The mutex is a robust mutex and the previous owning thread terminated
+while holding the mutex lock. The mutex lock shall be acquired by the
+calling thread and it is up to the new owner to make the state consistent.
+.P
+These functions shall not return an error code of
+.BR [EINTR] .
+.LP
+.IR "The following sections are informative."
+.SH EXAMPLES
+None.
+.SH "APPLICATION USAGE"
+Applications that have assumed that non-zero return values are errors
+will need updating for use with robust mutexes, since a valid return
+for a thread acquiring a mutex which is protecting a currently
+inconsistent state is
+.BR [EOWNERDEAD] .
+Applications that do not check the error returns, due to ruling out the
+possibility of such errors arising, should not use robust mutexes. If
+an application is supposed to work with normal and robust mutexes, it
+should check all return values for error conditions and if necessary
+take appropriate action.
+.SH RATIONALE
+If an implementation detects that the value specified by the
+.IR cond
+argument to
+\fIpthread_cond_timedwait\fR()
+or
+\fIpthread_cond_wait\fR()
+does not refer to an initialized condition variable, or detects that
+the value specified by the
+.IR mutex
+argument to
+\fIpthread_cond_timedwait\fR()
+or
+\fIpthread_cond_wait\fR()
+does not refer to an initialized mutex object, it is recommended
+that the function should fail and report an
+.BR [EINVAL]
+error.
+.SS "Condition Wait Semantics"
+.P
+It is important to note that when
+\fIpthread_cond_wait\fR()
+and
+\fIpthread_cond_timedwait\fR()
+return without error, the associated predicate may still be false.
+Similarly, when
+\fIpthread_cond_timedwait\fR()
+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.
+.P
+The application needs to recheck the predicate on any return because it
+cannot be sure there is another thread waiting on the thread to handle
+the signal, and if there is not then the signal is lost. The burden is
+on the application to check the predicate.
+.P
+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.
+.P
+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.
+.P
+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"
+.P
+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\fR()
+returns the current time and
+\fIcond_relative_timed_wait\fR()
+uses relative timeouts:
+.sp
+.RS 4
+.nf
+
+clock_gettime(CLOCK_REALTIME, &now)
+reltime = sleep_til_this_absolute_time -now;
+cond_relative_timed_wait(c, m, &reltime);
+.fi
+.P
+.RE
+.P
+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.
+.P
+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"
+.P
+A condition wait, whether timed or not, is a cancellation point. That
+is, the functions
+\fIpthread_cond_wait\fR()
+or
+\fIpthread_cond_timedwait\fR()
+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\(emwhatever 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.
+.P
+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.
+.P
+Therefore, since
+.IR some
+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.
+.P
+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"
+.P
+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).
+.P
+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.
+.P
+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"
+.P
+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"
+.P
+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"
+.P
+The
+\fIpthread_cond_timedwait\fR()
+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 4
+.nf
+
+(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 || mypredicate(&t))
+ setmystate(&t);
+(void) pthread_mutex_unlock(&t.mn);
+.fi
+.P
+.RE
+.P
+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"
+None.
+.SH "SEE ALSO"
+.IR "\fIpthread_cond_broadcast\fR\^(\|)"
+.P
+The Base Definitions volume of POSIX.1\(hy2017,
+.IR "Section 4.12" ", " "Memory Synchronization",
+.IR "\fB<pthread.h>\fP"
+.\"
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1-2017, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 7, 2018 Edition,
+Copyright (C) 2018 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 .
+.PP
+Any typographical or formatting errors that appear
+in this page are most likely
+to have been introduced during the conversion of the source files to
+man page format. To report such errors, see
+https://www.kernel.org/doc/man-pages/reporting_bugs.html .