pthread_mutexattr_gettype()--Get Mutex Type Attribute


  Syntax:
 #include <pthread.h>
 int pthread_mutexatttr_gettype(const pthread_mutexattr_t *attr,  
 				int *type);
  Service Program Name: QP0WPTHR

  Default Public Authority: *USE

  Threadsafe: Yes

  Signal Safe: Yes

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.


Mutex Types

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 IBM® i 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.


Authorities and Locks

None.


Parameters

attr
(Input) Address of the mutex attributes object
type
(Output) Address of the variable to receive the type attribute

Return Value

0
pthread_mutexattr_gettype() was successful.
value
pthread_mutexattr_gettype() was not successful. value is set to indicate the error condition.

Error Conditions

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.

[EINVAL]

The value specified for the argument is not correct.


Related Information


Example

Note: By using the code examples, you agree to the terms of the Code license and disclaimer information.

#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

API introduced: V4R3

[ Back to top | Pthread APIs | APIs by category ]