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

274 lines
8.1 KiB
HTML
Raw Normal View History

2024-04-02 14:02:31 +00:00
<!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_setcanceltype()--Set Cancel Type</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_setcanceltype()--Set Cancel Type</h2>
<div class="box" style="width: 60%;">
<br>
&nbsp;&nbsp;Syntax:
<pre>
#include &lt;pthread.h&gt;
int pthread_setcanceltype(int type, int *oldtype);
</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: Yes<br><br>
<!-- iddvc RMBR -->
<br>
</div>
<p>The <strong>pthread_setcanceltype</strong>() function sets the cancel <em>
type</em> to one of <strong>PTHREAD_CANCEL_DEFERRED</strong> or <strong>
PTHREAD_CANCEL_ASYNCHRONOUS</strong> and returns the old cancel type into the
location specified by <em>oldtype</em> (if <em>oldtype</em> is
non-<strong>NULL</strong>)</p>
<p>Cancelability consists of 3 separate states (disabled, deferred,
asynchronous) that can be represented by 2 boolean values.</p>
<table border width="80%">
<tr>
<th valign="top">Cancelability</th>
<th valign="top">Cancelability State</th>
<th valign="top">Cancelability Type</th>
</tr>
<tr>
<td align="left" valign="top" width="20%">disabled</td>
<td align="left" valign="top" width="40%"><strong>
PTHREAD_CANCEL_DISABLE</strong></td>
<td align="left" valign="top" width="40%"><strong>
PTHREAD_CANCEL_DEFERRED</strong></td>
</tr>
<tr>
<td align="left" valign="top">disabled</td>
<td align="left" valign="top"><strong>PTHREAD_CANCEL_DISABLE</strong></td>
<td align="left" valign="top"><strong>PTHREAD_CANCEL_ASYNCHRONOUS</strong></td>
</tr>
<tr>
<td align="left" valign="top">deferred</td>
<td align="left" valign="top"><strong>PTHREAD_CANCEL_ENABLE</strong></td>
<td align="left" valign="top"><strong>PTHREAD_CANCEL_DEFERRED</strong></td>
</tr>
<tr>
<td align="left" valign="top">asynchronous</td>
<td align="left" valign="top"><strong>PTHREAD_CANCEL_ENABLE</strong></td>
<td align="left" valign="top"><strong>PTHREAD_CANCEL_ASYNCHRONOUS</strong></td>
</tr>
</table>
<p>The default cancelability state is deferred.</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 which 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> It is recommended that your application not use
asynchronous thread cancellation through the <strong>
PTHREAD_CANCEL_ASYNCHRONOUS</strong> option of <strong>
pthread_setcanceltype</strong>(). See the common user errors section of this
document for more information.</p>
<br>
<h3>Authorities and Locks</h3>
<p>None.</p>
<br>
<h3>Parameters</h3>
<dl>
<dt><strong>type</strong></dt>
<dd>(Input) New cancel type (one of <strong>PTHREAD_CANCEL_DEFERRED</strong> or
<strong>PTHREAD_CANCEL_ASYNCHRONOUS</strong>)&nbsp;<a name="294773"></a></dd>
<dt><strong>oldtype</strong></dt>
<dd>(Output) Address of variable to contain old cancel type.
(<strong>NULL</strong> is allowed)</dd>
</dl>
<br>
<h3>Return Value</h3>
<dl>
<dt><strong>0</strong></dt>
<dd><strong>pthread_setcanceltype</strong>() was successful.</dd>
<dt><strong>value</strong></dt>
<dd><strong>pthread_setcanceltype</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_setcanceltype</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>
</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_39.htm">pthread_cancel()</a>--Cancel Thread<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_46.htm">pthread_testcancel()</a>--Create Cancellation
Point</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 &lt;pthread.h&gt;
#include &lt;stdio.h&gt;
#include "check.h"
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void cleanupHandler(void *parm)
{
int rc;
printf("Inside cleanup handler, unlock mutex\n");
rc = pthread_mutex_unlock((pthread_mutex_t *)parm);
checkResults("pthread_mutex_unlock\n", rc);
}
void *threadfunc(void *parm)
{
int rc;
int oldtype;
printf("Entered secondary thread, lock mutex\n");
rc = pthread_mutex_lock(&amp;mutex);
checkResults("pthread_mutex_lock()\n", rc);
pthread_cleanup_push(cleanupHandler, &amp;mutex);
/* We must assume there is a good reason for async. cancellability */
/* and also, we must assume that if we get interrupted, it is */
/* appropriate to unlock the mutex. More than likely it is not */
/* because we will have left some data structures in a strange state */
/* if we are async. interrupted while holding the mutex */
rc = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &amp;oldtype);
checkResults("pthread_setcanceltype()\n", rc);
printf("Secondary thread is now looping\n");
while (1) { sleep(1); }
printf("Unexpectedly got out of loop!\n");
pthread_cleanup_pop(0);
return NULL;
}
int main(int argc, char **argv)
{
pthread_t thread;
int rc=0;
void *status;
printf("Enter Testcase - %s\n", argv[0]);
/* 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(1);
printf("Cancel the thread\n");
rc = pthread_cancel(thread);
checkResults("pthread_cancel()\n", rc);
rc = pthread_join(thread, &amp;status);
if (status != PTHREAD_CANCELED) {
printf("Unexpected thread status\n");
exit(1);
}
printf("Main completed\n");
return 0;
}
</pre>
<p><strong>Output:</strong></p>
<pre>
Enter Testcase - QP0WTEST/TPSETCANT0
Create thread using the NULL attributes
Entered secondary thread, lock mutex
Secondary thread is now looping
Cancel the thread
Inside cleanup handler, unlock 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>