#include <pthread.h> int pthread_mutexatttr_gettype(const pthread_mutexattr_t *attr, int *type);Service Program Name: QP0WPTHR
The pthread_mutexattr_gettype() function retrieves the type attribute from the mutex attributes object specified by attr. The mutex type attribute is used to create mutexes with different behaviors.
The type returned is one of PTHREAD_MUTEX_DEFAULT, PTHREAD_MUTEX_NORMAL, PTHREAD_MUTEX_RECURSIVE, PTHREAD_MUTEX_ERRORCHECK, or PTHREAD_MUTEX_OWNERTERM_NP.
The default mutex type (or PTHREAD_MUTEX_DEFAULT) is PTHREAD_MUTEX_NORMAL.
A normal mutex cannot be locked repeatedly by the owner. Attempts by a thread to relock an already held mutex, or to lock a mutex that was held by another thread when that thread terminated, cause a deadlock condition.
A recursive mutex can be locked repeatedly by the owner. The mutex does not become unlocked until the owner has called pthread_mutex_unlock() for each successful lock request that it has outstanding on the mutex.
An errorcheck mutex checks for deadlock conditions that occur when a thread relocks an already held mutex. If a thread attempts to relock a mutex that it already holds, the lock request fails with the EDEADLK error.
An ownerterm mutex is an i5/OS extension to the errorcheck mutex type. An ownerterm mutex checks for deadlock conditions that occur when a thread relocks an already held mutex. If a thread attempts to relock a mutex that it already holds, the lock request fails with the EDEADLK error. An ownerterm mutex also checks for deadlock conditions that occur when a thread attempts to lock a mutex that was held by another thread when that thread terminated (an orphaned mutex). If a thread attempts to lock an orphaned mutex, the lock request fails with the EOWNERTERM error.
None.
If pthread_mutexatttr_gettype() was not successful, the error condition returned usually indicates one of the following errors. Under some conditions, the value returned could indicate an error other than those listed here.
The value specified for the argument is not correct.
See Code disclaimer information for information pertaining to code examples.
#define _MULTI_THREADED #include <pthread.h> #include <stdio.h> #include "check.h" int showType(pthread_mutexattr_t *mta) { int rc; int type; printf("Check type attribute\n"); rc = pthread_mutexattr_gettype(mta, &type); checkResults("pthread_mutexattr_gettype()\n", rc); printf("The type attributed is: "); switch (type) { case PTHREAD_MUTEX_NORMAL: printf("PTHREAD_MUTEX_NORMAL (DEFAULT)\n"); break; case PTHREAD_MUTEX_RECURSIVE: printf("PTHREAD_MUTEX_RECURSIVE\n"); break; case PTHREAD_MUTEX_ERRORCHECK: printf("PTHREAD_MUTEX_ERRORCHECK\n"); break; case PTHREAD_MUTEX_OWNERTERM_NP: printf("PTHREAD_MUTEX_OWNERTERM_NP\n"); break; default : printf("! type Error type=%d !\n", type); exit(1); } return type; } int main(int argc, char **argv) { int rc=0; pthread_mutexattr_t mta; int type=0; pthread_mutex_t mutex; struct timespec ts; printf("Enter Testcase - %s\n", argv[0]); printf("Create a default mutex attribute\n"); rc = pthread_mutexattr_init(&mta); checkResults("pthread_mutexattr_init()\n", rc); printf("Change mutex type attribute to recursive\n"); rc = pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE); checkResults("pthread_mutexattr_settype()\n", rc); showType(&mta); rc = pthread_mutexattr_setname_np(&mta, "RECURSIVE ONE"); checkResults("pthread_mutexattr_setname_np()\n", rc); printf("Create the named, recursive mutex\n"); rc = pthread_mutex_init(&mutex, &mta); checkResults("pthread_mutex_init()\n", rc); printf("Lock the named, recursive mutex\n"); rc = pthread_mutex_lock(&mutex); checkResults("pthread_mutex_lock() 1\n", rc); printf("ReLock the named, recursive mutex\n"); rc = pthread_mutex_lock(&mutex); checkResults("pthread_mutex_lock() 2\n", rc); printf("Trylock the named, recursive mutex\n"); rc = pthread_mutex_trylock(&mutex); checkResults("pthread_mutex_trylock()\n", rc); printf("Timedlock the named, recursive mutex\n"); ts.tv_sec = 5; ts.tv_nsec = 0; rc = pthread_mutex_timedlock_np(&mutex, &ts); checkResults("pthread_mutex_timedlock_np()\n", rc); printf("Sleeping for a short time holding the recurive mutex\n"); printf("Use DSPJOB, option 19 to see the held mutex\n"); sleep(30); printf("Unlock the mutex 4 times\n"); rc = pthread_mutex_unlock(&mutex); checkResults("pthread_mutex_unlock() 1\n", rc); rc = pthread_mutex_unlock(&mutex); checkResults("pthread_mutex_unlock() 2\n", rc); rc = pthread_mutex_unlock(&mutex); checkResults("pthread_mutex_unlock() 3\n", rc); rc = pthread_mutex_unlock(&mutex); checkResults("pthread_mutex_unlock() 4\n", rc); printf("Cleanup\n"); rc = pthread_mutex_destroy(&mutex); checkResults("pthread_mutex_destroy()\n", rc); rc = pthread_mutexattr_destroy(&mta); checkResults("pthread_mutexattr_destroy()\n", rc); printf("Main completed\n"); return 0; }
Output
Enter Testcase - QP0WTEST/TPMTXTYP0 Create a default mutex attribute Change mutex type attribute to recursive Check type attribute The type attributed is: PTHREAD_MUTEX_RECURSIVE Create the named, recursive mutex Lock the named, recursive mutex ReLock the named, recursive mutex Trylock the named, recursive mutex Timedlock the named, recursive mutex Sleeping for a short time holding the recurive mutex Use DSPJOB, option 19 to see the held mutex Unlock the mutex 4 times Cleanup Main completed
Top | Pthread APIs | APIs by category |