The pthread_mutex_destroy() function shall destroy the mutex
object referenced by mutex; the mutex object becomes, in effect,
uninitialized. An implementation may cause
pthread_mutex_destroy() to set the object referenced by mutex to
an invalid value.
A destroyed mutex object can be reinitialized using
pthread_mutex_init(); the results of otherwise referencing the
object after it has been destroyed are undefined.
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 pthread_cond_timedwait() or pthread_cond_wait() call by
another thread, results in undefined behavior.
The pthread_mutex_init() function shall initialize the mutex
referenced by mutex with attributes specified by attr. If 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.
See Section 2.9.9, Synchronization Object Copies and Alternative
Mappings for further requirements.
Attempting to initialize an already initialized mutex results in
undefined behavior.
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 pthread_mutex_init() with parameter attr specified
as NULL, except that no error checks are performed.
The behavior is undefined if the value specified by the mutex
argument to pthread_mutex_destroy() does not refer to an
initialized mutex.
The behavior is undefined if the value specified by the attr
argument to pthread_mutex_init() does not refer to an initialized
mutex attributes object.