Mutex attributes are used to specify parameters to
pthread_mutex_init(). Like with thread attributes, one attribute object can be used in multiple calls to
pthread_mutex_init(3), with or without modifications between calls.
The
pthread_mutexattr_init() function initializes
attr with all the default mutex attributes.
The
pthread_mutexattr_destroy() function destroys
attr.
The
pthread_mutexattr_settype() functions set the mutex
type value of the attribute. Valid mutex types are:
PTHREAD_MUTEX_NORMAL
This type of mutex does not check for usage errors. It will deadlock if reentered, and result in undefined behavior if a locked mutex is unlocked by another thread. Attempts to unlock an already unlocked PTHREAD_MUTEX_NORMAL mutex will result in undefined behavior.
PTHREAD_MUTEX_ERRORCHECK
These mutexes do check for usage errors. If an attempt is made to relock a PTHREAD_MUTEX_ERRORCHECK mutex without first dropping the lock, an error will be returned. If a thread attempts to unlock a PTHREAD_MUTEX_ERRORCHECK mutex that is locked by another thread, an error will be returned. If a thread attempts to unlock a PTHREAD_MUTEX_ERRORCHECK thread that is unlocked, an error will be returned.
PTHREAD_MUTEX_RECURSIVE
These mutexes allow recursive locking. An attempt to relock a
PTHREAD_MUTEX_RECURSIVE mutex that is already locked by the same thread succeeds. An equivalent number of
pthread_mutex_unlock(3) calls are needed before the mutex will wake another thread waiting on this lock. If a thread attempts to unlock a
PTHREAD_MUTEX_RECURSIVE mutex that is locked by another thread, an error will be returned. If a thread attempts to unlock a
PTHREAD_MUTEX_RECURSIVE thread that is unlocked, an error will be returned.
It is advised that
PTHREAD_MUTEX_RECURSIVE mutexes are not used with condition variables. This is because of the implicit unlocking done by
pthread_cond_wait(3) and
pthread_cond_timedwait(3).
PTHREAD_MUTEX_DEFAULT
Also this type of mutex will cause undefined behavior if reentered. Unlocking a
PTHREAD_MUTEX_DEFAULT mutex locked by another thread will result in undefined behavior. Attempts to unlock an already unlocked
PTHREAD_MUTEX_DEFAULT mutex will result in undefined behavior.
This is the default mutex type for
pthread_mutexaddr_init().
The
pthread_mutexattr_gettype() functions copy the type value of the attribute to the location pointed to by the second parameter.