diff options
Diffstat (limited to 'upstream/archlinux/man3p/pthread_mutex_destroy.3p')
-rw-r--r-- | upstream/archlinux/man3p/pthread_mutex_destroy.3p | 422 |
1 files changed, 422 insertions, 0 deletions
diff --git a/upstream/archlinux/man3p/pthread_mutex_destroy.3p b/upstream/archlinux/man3p/pthread_mutex_destroy.3p new file mode 100644 index 00000000..1be3493c --- /dev/null +++ b/upstream/archlinux/man3p/pthread_mutex_destroy.3p @@ -0,0 +1,422 @@ +'\" et +.TH PTHREAD_MUTEX_DESTROY "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_mutex_destroy, +pthread_mutex_init +\(em destroy and initialize a mutex +.SH SYNOPSIS +.LP +.nf +#include <pthread.h> +.P +int pthread_mutex_destroy(pthread_mutex_t *\fImutex\fP); +int pthread_mutex_init(pthread_mutex_t *restrict \fImutex\fP, + const pthread_mutexattr_t *restrict \fIattr\fP); +pthread_mutex_t \fImutex\fP = PTHREAD_MUTEX_INITIALIZER; +.fi +.SH DESCRIPTION +The +\fIpthread_mutex_destroy\fR() +function shall destroy the mutex object referenced by +.IR mutex ; +the mutex object becomes, in effect, uninitialized. An implementation +may cause +\fIpthread_mutex_destroy\fR() +to set the object referenced by +.IR mutex +to an invalid value. +.P +A destroyed mutex object can be reinitialized using +\fIpthread_mutex_init\fR(); +the results of otherwise referencing the object after it has been +destroyed are undefined. +.P +It shall be safe to destroy an initialized mutex that is unlocked. +Attempting to destroy a locked mutex, or a mutex that another thread +is attempting to lock, or a mutex that is being used in a +\fIpthread_cond_timedwait\fR() +or +\fIpthread_cond_wait\fR() +call by another thread, results in undefined behavior. +.P +The +\fIpthread_mutex_init\fR() +function shall initialize the mutex referenced by +.IR mutex +with attributes specified by +.IR attr . +If +.IR attr +is NULL, the default mutex attributes are used; the effect shall be the +same as passing the address of a default mutex attributes object. Upon +successful initialization, the state of the mutex becomes initialized +and unlocked. +.P +See +.IR "Section 2.9.9" ", " "Synchronization Object Copies and Alternative Mappings" +for further requirements. +.P +Attempting to initialize an already initialized mutex results in +undefined behavior. +.P +In cases where default mutex attributes are appropriate, the macro +PTHREAD_MUTEX_INITIALIZER can be used to initialize mutexes. The +effect shall be equivalent to dynamic initialization by a call to +\fIpthread_mutex_init\fR() +with parameter +.IR attr +specified as NULL, except that no error checks are performed. +.P +The behavior is undefined if the value specified by the +.IR mutex +argument to +\fIpthread_mutex_destroy\fR() +does not refer to an initialized mutex. +.P +The behavior is undefined if the value specified by the +.IR attr +argument to +\fIpthread_mutex_init\fR() +does not refer to an initialized mutex attributes object. +.SH "RETURN VALUE" +If successful, the +\fIpthread_mutex_destroy\fR() +and +\fIpthread_mutex_init\fR() +functions shall return zero; otherwise, an error number shall be +returned to indicate the error. +.SH ERRORS +The +\fIpthread_mutex_init\fR() +function shall fail if: +.TP +.BR EAGAIN +The system lacked the necessary resources (other than memory) to +initialize another mutex. +.TP +.BR ENOMEM +Insufficient memory exists to initialize the mutex. +.TP +.BR EPERM +The caller does not have the privilege to perform the operation. +.br +.P +The +\fIpthread_mutex_init\fR() +function may fail if: +.TP +.BR EINVAL +The attributes object referenced by +.IR attr +has the robust mutex attribute set without the process-shared attribute +being set. +.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" +None. +.SH RATIONALE +If an implementation detects that the value specified by the +.IR mutex +argument to +\fIpthread_mutex_destroy\fR() +does not refer to an initialized mutex, it is recommended that the +function should fail and report an +.BR [EINVAL] +error. +.P +If an implementation detects that the value specified by the +.IR mutex +argument to +\fIpthread_mutex_destroy\fR() +or +\fIpthread_mutex_init\fR() +refers to a locked mutex or a mutex that is referenced (for example, +while being used in a +\fIpthread_cond_timedwait\fR() +or +\fIpthread_cond_wait\fR()) +by another thread, or detects that the value specified by the +.IR mutex +argument to +\fIpthread_mutex_init\fR() +refers to an already initialized mutex, it is recommended that the +function should fail and report an +.BR [EBUSY] +error. +.P +If an implementation detects that the value specified by the +.IR attr +argument to +\fIpthread_mutex_init\fR() +does not refer to an initialized mutex attributes object, it is +recommended that the function should fail and report an +.BR [EINVAL] +error. +.SS "Alternate Implementations Possible" +.P +This volume of POSIX.1\(hy2017 supports several alternative implementations of mutexes. +An implementation may store the lock directly in the object of type +.BR pthread_mutex_t . +Alternatively, an implementation may store the lock in the heap and +merely store a pointer, handle, or unique ID in the mutex object. +Either implementation has advantages or may be required on certain +hardware configurations. So that portable code can be written that is +invariant to this choice, this volume of POSIX.1\(hy2017 does not define assignment or +equality for this type, and it uses the term ``initialize'' to +reinforce the (more restrictive) notion that the lock may actually +reside in the mutex object itself. +.P +Note that this precludes an over-specification of the type of the mutex +or condition variable and motivates the opaqueness of the type. +.P +An implementation is permitted, but not required, to have +\fIpthread_mutex_destroy\fR() +store an illegal value into the mutex. This may help detect erroneous +programs that try to lock (or otherwise reference) a mutex that has +already been destroyed. +.SS "Tradeoff Between Error Checks and Performance Supported" +.P +Many error conditions that can occur are not required to be detected by +the implementation in order to let implementations trade off performance +\fIversus\fR degree of error checking according to the needs of their +specific applications and execution environment. As a general rule, +conditions caused by the system (such as insufficient memory) are required +to be detected, but conditions caused by an erroneously coded application +(such as failing to provide adequate synchronization to prevent a mutex +from being deleted while in use) are specified to result in undefined +behavior. +.P +A wide range of implementations is thus made possible. For example, an +implementation intended for application debugging may implement all of +the error checks, but an implementation running a single, provably +correct application under very tight performance constraints in an +embedded computer might implement minimal checks. An implementation +might even be provided in two versions, similar to the options that +compilers provide: a full-checking, but slower version; and a +limited-checking, but faster version. To forbid this optionality would +be a disservice to users. +.P +By carefully limiting the use of ``undefined behavior'' only to things +that an erroneous (badly coded) application might do, and by defining +that resource-not-available errors are mandatory, this volume of POSIX.1\(hy2017 ensures that +a fully-conforming application is portable across the full range of +implementations, while not forcing all implementations to add overhead +to check for numerous things that a correct program never does. When the +behavior is undefined, no error number is specified to be returned on +implementations that do detect the condition. This is because undefined +behavior means \fIanything\fR can happen, which includes returning +with any value (which might happen to be a valid, but different, error +number). However, since the error number might be useful to application +developers when diagnosing problems during application development, a +recommendation is made in rationale that implementors should return a +particular error number if their implementation does detect the condition. +.SS "Why No Limits are Defined" +.P +Defining symbols for the maximum number of mutexes and condition +variables was considered but rejected because the number of these +objects may change dynamically. Furthermore, many implementations +place these objects into application memory; thus, there is no explicit +maximum. +.SS "Static Initializers for Mutexes and Condition Variables" +.P +Providing for static initialization of statically allocated +synchronization objects allows modules with private static +synchronization variables to avoid runtime initialization tests and +overhead. Furthermore, it simplifies the coding of self-initializing +modules. Such modules are common in C libraries, where for various +reasons the design calls for self-initialization instead of requiring +an explicit module initialization function to be called. An example +use of static initialization follows. +.P +Without static initialization, a self-initializing routine +\fIfoo\fR() +might look as follows: +.sp +.RS 4 +.nf + +static pthread_once_t foo_once = PTHREAD_ONCE_INIT; +static pthread_mutex_t foo_mutex; +.P +void foo_init() +{ + pthread_mutex_init(&foo_mutex, NULL); +} +.P +void foo() +{ + pthread_once(&foo_once, foo_init); + pthread_mutex_lock(&foo_mutex); + /* Do work. */ + pthread_mutex_unlock(&foo_mutex); +} +.fi +.P +.RE +.P +With static initialization, the same routine could be coded as +follows: +.sp +.RS 4 +.nf + +static pthread_mutex_t foo_mutex = PTHREAD_MUTEX_INITIALIZER; +.P +void foo() +{ + pthread_mutex_lock(&foo_mutex); + /* Do work. */ + pthread_mutex_unlock(&foo_mutex); +} +.fi +.P +.RE +.P +Note that the static initialization both eliminates the need for the +initialization test inside +\fIpthread_once\fR() +and the fetch of &\fIfoo_mutex\fP to learn the address to be passed to +\fIpthread_mutex_lock\fR() +or +\fIpthread_mutex_unlock\fR(). +.P +Thus, the C code written to initialize static objects is simpler on all +systems and is also faster on a large class of systems; those where the +(entire) synchronization object can be stored in application memory. +.P +Yet the locking performance question is likely to be raised for +machines that require mutexes to be allocated out of special memory. +Such machines actually have to have mutexes and possibly condition +variables contain pointers to the actual hardware locks. For static +initialization to work on such machines, +\fIpthread_mutex_lock\fR() +also has to test whether or not the pointer to the actual lock has been +allocated. If it has not, +\fIpthread_mutex_lock\fR() +has to initialize it before use. The reservation of such resources can +be made when the program is loaded, and hence return codes have not +been added to mutex locking and condition variable waiting to indicate +failure to complete initialization. +.P +This runtime test in +\fIpthread_mutex_lock\fR() +would at first seem to be extra work; an extra test is required to see +whether the pointer has been initialized. On most machines this would +actually be implemented as a fetch of the pointer, testing the pointer +against zero, and then using the pointer if it has already been +initialized. While the test might seem to add extra work, the extra +effort of testing a register is usually negligible since no extra +memory references are actually done. As more and more machines provide +caches, the real expenses are memory references, not instructions +executed. +.P +Alternatively, depending on the machine architecture, there are often +ways to eliminate +.IR all +overhead in the most important case: on the lock operations that occur +.IR after +the lock has been initialized. This can be done by shifting more +overhead to the less frequent operation: initialization. Since +out-of-line mutex allocation also means that an address has to be +dereferenced to find the actual lock, one technique that is widely +applicable is to have static initialization store a bogus value for +that address; in particular, an address that causes a machine fault to +occur. When such a fault occurs upon the first attempt to lock such a +mutex, validity checks can be done, and then the correct address for +the actual lock can be filled in. Subsequent lock operations incur no +extra overhead since they do not ``fault''. This is merely one +technique that can be used to support static initialization, while not +adversely affecting the performance of lock acquisition. No doubt +there are other techniques that are highly machine-dependent. +.P +The locking overhead for machines doing out-of-line mutex allocation is +thus similar for modules being implicitly initialized, where it is +improved for those doing mutex allocation entirely inline. The inline +case is thus made much faster, and the out-of-line case is not +significantly worse. +.P +Besides the issue of locking performance for such machines, a concern +is raised that it is possible that threads would serialize contending +for initialization locks when attempting to finish initializing +statically allocated mutexes. (Such finishing would typically involve +taking an internal lock, allocating a structure, storing a pointer to +the structure in the mutex, and releasing the internal lock.) First, +many implementations would reduce such serialization by hashing on the +mutex address. Second, such serialization can only occur a bounded +number of times. In particular, it can happen at most as many times as +there are statically allocated synchronization objects. Dynamically +allocated objects would still be initialized via +\fIpthread_mutex_init\fR() +or +\fIpthread_cond_init\fR(). +.P +Finally, if none of the above optimization techniques for out-of-line +allocation yields sufficient performance for an application on some +implementation, the application can avoid static initialization +altogether by explicitly initializing all synchronization objects with +the corresponding +.IR pthread_*_init (\|) +functions, which are supported by all implementations. An +implementation can also document the tradeoffs and advise which +initialization technique is more efficient for that particular +implementation. +.SS "Destroying Mutexes" +.P +A mutex can be destroyed immediately after it is unlocked. However, +since attempting to destroy a locked mutex, or a mutex that another +thread is attempting to lock, or a mutex that is being used in a +\fIpthread_cond_timedwait\fR() +or +\fIpthread_cond_wait\fR() +call by another thread, results in undefined behavior, care must be +taken to ensure that no other thread may be referencing the mutex. +.SS "Robust Mutexes" +.P +Implementations are required to provide robust mutexes +for mutexes with the process-shared attribute set to +PTHREAD_PROCESS_SHARED. Implementations are allowed, but not required, +to provide robust mutexes when the process-shared attribute is set to +PTHREAD_PROCESS_PRIVATE. +.SH "FUTURE DIRECTIONS" +None. +.SH "SEE ALSO" +.ad l +.IR "\fIpthread_mutex_getprioceiling\fR\^(\|)", +.IR "\fIpthread_mutexattr_getrobust\fR\^(\|)", +.IR "\fIpthread_mutex_lock\fR\^(\|)", +.IR "\fIpthread_mutex_timedlock\fR\^(\|)", +.IR "\fIpthread_mutexattr_getpshared\fR\^(\|)" +.ad b +.P +The Base Definitions volume of POSIX.1\(hy2017, +.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 . |