<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="Copyright" content="Copyright (c) 2006 by IBM Corporation"> <title>pthread_mutex_timedlock_np()--Lock Mutex with Time-Out</title> <!-- All rights reserved. Licensed Materials Property of IBM --> <!-- US Government Users Restricted Rights --> <!-- Use, duplication or disclosure restricted by --> <!-- GSA ADP Schedule Contract with IBM Corp. --> <!-- Begin Header Records ========================================== --> <!-- NETMG2 SCRIPT A converted by B2H R4.1 (346) (CMS) by HOLTJM at --> <!-- RCHVMW2 on 29 Jan 1999 at 10:01:37 --> <!--File Edited November 2001 --> <!--End Header Records --> <link rel="stylesheet" type="text/css" href="../rzahg/ic.css"> </head> <body> <!-- Java sync-link --> <script language="Javascript" src="../rzahg/synch.js" type="text/javascript"> </script> <a name="Top_Of_Page"></a> <h2>pthread_mutex_timedlock_np()--Lock Mutex with Time-Out</h2> <div class="box" style="width: 70%;"> <br> Syntax: <pre> #include <pthread.h> #include <time.h> int pthread_mutex_timedlock_np(pthread_mutex_t *mutex, const struct timespec *deltatime); </pre> Service Program Name: QP0WPTHR<br> <!-- iddvc RMBR --> <br> Default Public Authority: *USE <br> <!-- iddvc RMBR --> <br> Threadsafe: Yes<br> <!-- iddvc RMBR --> <br> Signal Safe: Yes<br> <!-- iddvc RMBR --> <br> </div> <p>The <strong>pthread_mutex_timedlock_np</strong>() function acquires ownership of the <em>mutex</em> specified. If the mutex is currently locked by another thread, the call to <strong>pthread_mutex_timedlock_np</strong>() will block until the specified deltatime has elapsed or the holding thread relinquishes ownership by a call to <strong>pthread_mutex_unlock</strong>().</p> <p>Performing a <strong>pthread_mutex_timedlock_np</strong>() wait for a mutex has different semantics related to signal handling than the <strong> pthread_mutex_lock</strong>() function. If a signal is delivered to a thread while that thread is performing a timed wait for a mutex, the signal is held pending until either the mutex is acquired or the time-out occurs. At that time the signal handler will run, when the signal handler returns, <strong> pthread_mutex_timedlock_np</strong>() will return the results of the timed mutex wait.</p> <p>Use the CL command WRKJOB, option 20 for a screen that will aid in debugging mutex deadlocks.</p> <p>Destroying a held mutex is a common way to serialize destruction of objects that are protected by that mutex, and is allowed. The call to <strong> pthread_mutex_timedlock_np</strong>() may fail with the <strong> EDESTROYED</strong> error if the mutex is destroyed by the thread that was currently holding it.</p> <p>Note that mutex initialization using the <strong> PTHREAD_MUTEX_INITIALIZER</strong> does not immediately initialize the mutex. Instead, on first use, <strong>pthread_mutex_timedlock_np</strong>(), <strong> pthread_mutex_lock</strong>() or <strong>pthread_mutex_trylock</strong>() branches into a slow path and causes the initialization of the mutex. Because a mutex is not just a simple memory object, and requires that some resources be allocated by the system, an attempt to call <strong> pthread_mutex_destroy</strong>() or <strong>pthread_mutex_unlock</strong>() on a mutex that has was statically initialized using <strong> PTHREAD_MUTEX_INITIALIZER</strong> and was not yet locked will result in an <strong>EINVAL</strong> error.</p> <p>A pthread mutex is a structure of type pthread_mutex_t that implement a behavior based on the Pthread mutexes. An MI mutex is a structure built into the machine that implement a similar sort of serialization construct.</p> <p>The maximum number of recursive locks by the owning thread is 32,767. After which, attempts to lock the mutex will return the <strong>ERECURSE</strong> error.</p> <p><strong>Note:</strong> This function is not portable</p> <br> <h3>Mutex Types</h3> <p>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 result in a deadlock condition.</p> <p>A recursive mutex can be locked repeatedly by the owner. The mutex does not become unlocked until the owner has called <strong> pthread_mutex_unlock</strong>() for each successful lock request that it has outstanding on the mutex.</p> <p>An errorcheck mutex checks for deadlock conditions that occur when a thread re-locks an already held mutex. If a thread attempts to relock a mutex that it already holds, the lock request fails with the <strong>EDEADLK</strong> error.</p> <p>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 re-locks an already held mutex. If a thread attempts to relock a mutex that it already holds, the lock request fails with the <strong>EDEADLK</strong> 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 <strong>EOWNERTERM</strong> error.</p> <p>When a thread terminates while holding a mutex lock on a normal or errorcheck mutex, other threads that wait for that mutex will block forever, or until the specified deltatime has elapsed. The pthreads run-time simulates the deadlock that has occurred in your application. When attempting to debug these deadlock scenarios, the CL command WRKJOB, option 20 will show the thread as in a condition wait. Displaying the call stack will show that the function <strong>deadlockedOnOrphanedMutex</strong> or <strong> timedDeadlockOnOrphanedMutex</strong> is in the call stack.</p> <p>When a thread attempts to acquire a normal mutex that it already holds, the thread will block forever, or until the specified deltatime has elapsed. The pthreads run-time simulates the deadlock that has occurred in your application. When attempting to debug these deadlock scenarios, the CL command WRKJOB, option 20 will show the thread as in a condition wait. Displaying the call stack will show that the function <strong> deadlockOnAlreadyHeldMutex</strong> or <strong> timedDeadlockOnAlreadyHeldMutex</strong> is in the call stack.</p> <p>In order to change these behaviors, use an errorcheck or ownerterm mutex type.</p> <br> <h3>Authorities and Locks</h3> <p>None.</p> <br> <h3>Parameters</h3> <dl> <dt><strong>mutex</strong></dt> <dd>(Input) The address of the mutex to lock</dd> </dl> <br> <h3>Return Value</h3> <dl> <dt><strong>0</strong></dt> <dd><strong>pthread_mutex_timedlock_np</strong>() was successful.</dd> <dt><strong>value</strong></dt> <dd><strong>pthread_mutex_timedlock_np</strong>() was not successful. <em> value</em> is set to indicate the error condition.</dd> </dl> <br> <h3>Error Conditions</h3> <p>If <strong>pthread_mutex_timedlock_np</strong>() 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.</p> <dl> <dt><em>[EINVAL]</em></dt> <dd><p>The value specified for the argument is not correct.</p></dd> <dt><em>[EDESTROYED]</em></dt> <dd><p>While waiting for the mutex lock to be satisfied, the mutex was destroyed.</p></dd> <dt><em>[EBUSY]</em></dt> <dd><p>The attempt to lock the mutex timed out because the mutex was already locked.</p></dd> <dt><em>[EOWNERTERM]</em></dt> <dd><p>A thread terminated holding the mutex, and the mutex is an ownerterm mutex type.</p></dd> <dt><em>[EDEADLK]</em></dt> <dd><p>A thread attempted to relock an already held mutex, and the mutex is an errorcheck mutex type.</p></dd> <dt><em>[ERECURSE]</em></dt> <dd><p>The recursive mutex cannot be recursively locked again.</p></dd> </dl> <br> <h3>Related Information</h3> <ul> <li>The <<strong>pthread.h</strong>> header file. See <a href= "rzah4hed.htm">Header files for Pthread functions</a>.<br><br></li> <li><a href="users_60.htm">pthread_mutex_destroy()</a>--Destroy Mutex<br><br></li> <li><a href="users_61.htm">pthread_mutex_init()</a>--Initialize Mutex<br><br></li> <li><a href="users_62.htm">pthread_mutex_lock()</a>--Lock Mutex<br><br></li> <li><a href="users_64.htm">pthread_mutex_trylock()</a>--Lock Mutex with No Wait<br><br></li> <li><a href="users_65.htm">pthread_mutex_unlock()</a>--Unlock Mutex</li> </ul> <br> <h3>Example</h3> <p>See <a href="../apiref/aboutapis.htm#codedisclaimer">Code disclaimer information</a> for information pertaining to code examples.</p> <pre> #define _MULTI_THREADED #include <pthread.h> #include <stdio.h> #include "check.h" pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void *threadFunc(void *parm) { int rc; int i; struct timespec deltatime; deltatime.tv_sec = 5; deltatime.tv_nsec = 0; printf("Timed lock the mutex from a secondary thread\n"); rc = pthread_mutex_timedlock_np(&mutex, &deltatime); if (rc != EBUSY) { printf("Got an incorrect return code from pthread_mutex_timedlock_np\n"); } printf("Thread mutex timeout\n"); return 0; } int main(int argc, char **argv) { int rc=0; pthread_t thread; printf("Enter Testcase - %s\n", argv[0]); printf("Acquire the mutex in the initial thread\n"); rc = pthread_mutex_lock(&mutex); checkResults("pthread_mutex_lock()\n", rc), printf("Create a thread\n"); rc = pthread_create(&thread, NULL, threadFunc, NULL); checkResults("pthread_create()\n", rc); printf("Join to the thread\n"); rc = pthread_join(thread, NULL); checkResults("pthread_join()\n", rc); printf("Destroy mutex\n"); pthread_mutex_destroy(&mutex); printf("Main completed\n"); return 0; } </pre> <p><strong>Output:</strong></p> <pre> Enter Testcase - QP0WTEST/TPMTXTIM0 Acquire the mutex in the initial thread Create a thread Join to the thread Timed lock the mutex from a secondary thread Thread mutex timeout Destroy mutex Main completed </pre> <hr> API introduced: V4R3 <hr> <center> <table cellpadding="2" cellspacing="2"> <tr align="center"> <td valign="middle" align="center"><a href="#Top_Of_Page">Top</a> | <a href= "rzah4mst.htm">Pthread APIs</a> | <a href="aplist.htm">APIs by category</a></td> </tr> </table> </center> </body> </html>