ibm-information-center/dist/eclipse/plugins/i5OS.ic.apis_5.4.0.1/users_39.htm

255 lines
7.4 KiB
HTML

<!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_cancel()--Cancel Thread</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_cancel()--Cancel Thread</h2>
<div class="box" style="width: 50%;">
<br>
&nbsp;&nbsp;Syntax:
<pre>
#include &lt;pthread.h&gt;
int pthread_cancel(pthread_t thread);
</pre>
&nbsp;&nbsp;Service Program Name: QP0WPTHR<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Default Public Authority: *USE<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Threadsafe: Yes<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Signal Safe: No<br>
<!-- iddvc RMBR -->
<br>
</div>
<p>The <strong>pthread_cancel</strong>() function requests cancellation of the
target thread. The target thread is cancelled, based on its ability to be
cancelled.</p>
<p>When cancelability is disabled, all cancels are held pending in the target
thread until the thread changes the cancelability. When cancelability is
deferred, all cancels are held pending in the target thread until the thread
changes the cancelability, calls a function that is a cancellation point, or
calls <strong>pthread_testcancel</strong>(), thus creating a cancellation
point. When cancelability is asynchronous, all cancels are acted upon
immediately, interrupting the thread with its processing.</p>
<p><strong>Note:</strong> You should not use asynchronous thread cancellation
through the <strong>PTHREAD_CANCEL_ASYNCHRONOUS</strong> option of
<strong>pthread_setcanceltype</strong>() in your application. See the common
user errors section of this document for more information.</p>
<p>The following functions are cancellation points:</p>
<ul>
<li>pthread_cond_timedwait()</li>
<li>pthread_cond_wait()</li>
<li>pthread_delay_np()</li>
<li>pthread_join()</li>
<li>pthread_join_np()</li>
<li>pthread_extendedjoin_np()</li>
<li>pthread_testcancel()</li>
</ul>
<p>After action is taken for the target thread to be cancelled, the following
events occur in that thread.</p>
<ol>
<li>The thread calls cancellation cleanup handlers with cancellation disabled
until the last cancellation cleanup handler returns. The handlers are called in
Last In, First Out (LIFO) order.</li>
<li>Data destructors are called for any thread-specific data entries that have
a non NULL value for both the value and the destructor.</li>
<li>When the last cancellation cleanup handler returns, the thread is
terminated and a status of <strong>PTHREAD_CANCELED</strong> is made available
to any threads joining the target.</li>
<li>Any mutexes that are held by a thread that terminates, are abandoned and
are no longer valid. Subsequent calls by other threads that attempt to acquire
the abandoned mutex (<strong>pthread_mutex_lock</strong>() or
<strong>pthread_mutex_trylock</strong>()) fail with an
<strong>EOWNERTERM</strong> error.</li>
<li>Application visible process resources are not released. This includes but
is not limited to mutexes, file descriptors, or any process level cleanup
actions.</li>
</ol>
<p>A cancellation cleanup handler should not exit by <strong>longjmp()</strong>
or <strong>siglongjmp()</strong>.</p>
<p>In the i5/OS implementation of threads, the initial thread is special.
Termination of the initial thread by <strong>pthread_exit</strong>(),
<strong>pthread_cancel</strong>() or any other thread termination mechanism
terminates the entire process.</p>
<br>
<h3>Authorities and Locks</h3>
<p>None.</p>
<br>
<h3>Parameters</h3>
<dl>
<dt><strong>thread</strong></dt>
<dd>(Input) Pthread handle to the target thread</dd>
</dl>
<br>
<h3>Return Value</h3>
<dl>
<dt><strong>0</strong></dt>
<dd><strong>pthread_cancel</strong>() was successful.<br><br></dd>
<dt><strong>value</strong></dt>
<dd><strong>pthread_cancel</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_cancel</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.&nbsp;<a name=
"294434"></a></p></dd>
<dt><em>[ESRCH]</em></dt>
<dd><p>No thread could be found that matched the thread ID specified.</p></dd>
</dl>
<br>
<h3>Related Information</h3>
<ul>
<li>The &lt;<strong>pthread.h</strong>&gt; header file. See <a href=
"rzah4hed.htm">Header files for Pthread functions</a>.<br><br></li>
<li><a href="users_41.htm">pthread_cleanup_pop()</a>--Pop Cleanup Handler off of
Cancellation Cleanup Stack<br><br></li>
<li><a href="users_42.htm">pthread_cleanup_push()</a>--Push Cleanup Handler onto
Cancellation Cleanup Stack<br><br></li>
<li><a href="users_18.htm">pthread_exit()</a>--Terminate Calling Thread<br><br></li>
<li><a href="users_44.htm">pthread_setcancelstate()</a>--Set Cancel State<br><br></li>
<li><a href="users_45.htm">pthread_setcanceltype()</a>--Set Cancel Type</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>
#include &lt;pthread.h&gt;
#include &lt;stdio.h&gt;
#include "check.h"
void *threadfunc(void *parm)
{
printf("Entered secondary thread\n");
while (1) {
printf("Secondary thread is looping\n");
pthread_testcancel();
sleep(1);
}
return NULL;
}
int main(int argc, char **argv)
{
pthread_t thread;
int rc=0;
printf("Entering testcase\n");
/* Create a thread using default attributes */
printf("Create thread using the NULL attributes\n");
rc = pthread_create(&amp;thread, NULL, threadfunc, NULL);
checkResults("pthread_create(NULL)\n", rc);
/* sleep() is not a very robust way to wait for the thread */
sleep(2);
printf("Cancel the thread\n");
rc = pthread_cancel(thread);
checkResults("pthread_cancel()\n", rc);
/* sleep() is not a very robust way to wait for the thread */
sleep(3);
printf("Main completed\n");
return 0;
}
</pre>
<p><strong>Output:</strong></p>
<pre>
Entering testcase
Create thread using the NULL attributes
Entered secondary thread
Secondary thread is looping
Secondary thread is looping
Cancel the thread
Main completed
</pre>
<br>
<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>