PTHREAD_COND_WAIT(3C) Standard C Library Functions PTHREAD_COND_WAIT(3C)

NAME


pthread_cond_wait, pthread_cond_clockwait, pthread_cond_timedwait,
pthread_cond_relclockwait_np, pthread_cond_reltimedwait_np - wait on a
condition

LIBRARY


Standard C Library (libc, -lc)

SYNOPSIS


int
pthread_cond_wait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex);

int
pthread_cond_clockwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex, clockid_t clock,
const struct timespec *restrict abstime);

int
pthread_cond_timedwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime);

int
pthread_cond_relclockwait_np(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex, clockid_t clock,
const struct timespec *restrict reltime);

int
pthread_cond_reltimedwait_np(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict reltime);

DESCRIPTION


The pthread_cond_wait(), pthread_cond_clockwait(),
pthread_cond_timedwait(), pthread_cond_relclockwait_np(), and
pthread_cond_reltimedwait_np() functions are used to block on a
condition variable. They must be called with mutex locked by the
calling thread or undefined behavior will result.

These functions atomically release mutex and cause the calling thread
to block on the condition variable 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 pthread_cond_signal(3C) or
pthread_cond_broadcast(3C) in that thread behaves as if it were issued
after the about-to-block thread has blocked.

Upon successful return, the mutex has been locked and is owned by the
calling thread. If mutex is a robust mutex where an owner terminated
while holding the lock and the state is recoverable, the mutex is
acquired even though the function returns an error value.

When using condition variables there is always a boolean predicate, an
invariant, associated with each condition wait that must be true before
the thread should proceed. Spurious wakeups from the
pthread_cond_wait(), pthread_cond_clockwait(),
pthread_cond_timedwait(), pthread_cond_relclockwait_np(), or
pthread_cond_reltimedwait_np() functions could occur. The return from
these functions does not imply anything about the value of this
predicate and the predicate must always be reevaluated.

The order in which blocked threads are awakened by
pthread_cond_signal(3C) or pthread_cond_broadcast(3C) is determined by
the scheduling policy. See pthreads(7).

The effect of using more than one mutex for concurrent
pthread_cond_wait(), pthread_cond_clockwait(),
pthread_cond_timedwait(), pthread_cond_relclockwait_np(), or
pthread_cond_reltimedwait_np() operations on the same condition
variable will result in undefined behavior.

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 reacquired
before calling the first cancellation cleanup handler.

A thread that has been unblocked because it has been canceled while
blocked in a call to any of these functions does not consume any
condition signal that may be directed concurrently at the condition
variable if there are other threads blocked on the condition variable.

The pthread_cond_wait() function will block forever until it is
signaled. With the other functions, it is possible to bound the amount
of time that the calling thread will block waiting to be signaled.
When a timeout occurs, the calling threads will return with the mutex
held, but will instead indicate an error occurred.

In general, the system provides the ability to program timeouts against
either the realtime clock, CLOCK_REALTIME, which measures the wall
clock and is subject to changes due to time synchronization daemons
such as NTP and PTP, or the high-resolution clock, CLOCK_HIGHRES, which
is a non-adjustable high-resolution clock that is provided by system
hardware. The specified timeout may either be specified as an absolute
time in the future or as a relative amount of time that should elapse.
Each clock has its own resolution, which can be determined by
clock_getres(3C). Timeouts may be rounded up to a given clock's
resolution.

The pthread_cond_timedwait() and pthrad_cond_reltimedwait_np()
functions determine which clock they use to wait based upon the clock
that the condition variable was created with. By default, all timed
condition variables utilize the realtime clock, CLOCK_REALTIME. The
default clock may be changed on a per-condition variable basis by
setting the condition variable's attributes with the
pthread_condattr_setclock(3C) function when creating the condition
variable.

The pthread_cond_clockwait() and pthread_cond_relclockwait_np()
functions ignore the condition variable's defined clock and instead
utilize the clock specified by the clock argument. While there are
additional clocks in the system, only CLOCK_REALTIME or CLOCK_HIGHRES
may be specified. The thread and process-specific CPU time clocks
cannot be used.

The pthread_cond_clockwait() and pthread_cond_timedwait() functions
treat the timeout value, abstime, as the absolute time in the future
when the timeout should expire. Conversely, the
pthread_cond_relclockwait_np() and pthread_cond_reltimedwait_np()
functions operate in terms of a relative time. The timer will expire
when a specified amount of time passes on the clock as indicated by
reltime.

The pthread_cond_wait(), pthread_cond_clockwait(),
pthread_cond_timedwait(), pthread_cond_relclockwait_np(), or
pthread_cond_reltimedwait_np() functions split the errors that they
return into those that occur before and those that occur after dropping
the lock in any form. In particular, error checking is guaranteed to
occur before releasing the mutex and waiting on the condition variable.
The errors ETIMEDOUT, EOWNERDEAD, and ENOTRECOVERABLE are the only
errors that may occur after a wait has begun. The latter two errors
only apply to a robust mutex. No matter why the calling functions
return, they will always return with the mutex mutex held, excepting
certain unrecoverable robust mutexes. In addition, if the calling
thread that is waiting on a condition variable takes a signal, the
thread will never return EINTR. It may resume blocking or potentially
deliver a spurious wakeup.

RETURN VALUES


Upon successful completion, the pthread_cond_wait(),
pthread_cond_clockwait(), pthread_cond_timedwait(),
pthread_cond_relclockwait_np(), and pthread_cond_reltimedwait_np()
functions return 0. Otherwise, an error value is returned to indicate
the error.

ERRORS


The pthread_cond_wait(), pthread_cond_clockwait(),
pthread_cond_timedwait(), pthread_cond_relclockwait_np(), and
pthread_cond_reltimedwait_np() functions will fail if:

EPERM The mutex type is PTHREAD_MUTEX_ERRORCHECK or the
mutex is a robust mutex, and the current thread does
not own the mutex.

ETIMEDOUT The absolute or relative time specified by abstime
and reltime respectively, has passed. This does not
apply to pthread_cond_wait().

EINVAL One or more of the values specified by cond, mutex,
abstime, or reltime is invalid.

Different mutexes were supplied for concurrent
operation on the same condition variable.

The value of clock is either unsupported for timing
operations or the value is unknown to the system.

EOWNERDEAD The mutex is a robust mutex initialized with the
attribute PTHREAD_MUTEX_ROBUST and the last owner of
this mutex died while holding the mutex, leaving the
state it was protecting possibly inconsistent. The
mutex is now owned by the caller.

ENOTRECOVERABLE The mutex is a robust mutex initialized with the
attribute PTHREAD_MUTEX_ROBUST and the mutex was
protecting state that has now been left
irrecoverable. The mutex has not been acquired.

INTERFACE STABILITY


Committed

MT-LEVEL
MT-Safe

SEE ALSO


clock_getres(3C), pthread_cond_broadcast(3C), pthread_cond_signal(3C),
pthread_condattr_setclock(3C), pthread_mutex_lock(3C),
pthread_mutexattr_getrobust(3C), time.h(3HEAD), attributes(7),
condition(7), pthreads(7), standards(7)

illumos June 23, 2024 illumos

tribblix@gmail.com :: GitHub :: Privacy