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

222 lines
6.5 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_key_create()--Create Thread Local Storage Key</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_key_create()--Create Thread Local Storage Key</h2>
<div class="box" style="width: 75%;">
<br>
&nbsp;&nbsp;Syntax:
<pre>
#include &lt;pthread.h&gt;
int pthread_key_create(pthread_key_t *key, void (*destructor)(void *));
</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_key_create</strong>() function creates a thread local
storage <em>key</em> for the process and associates the <em>destructor</em>
function with that <em>key</em>. After a key is created, that key can be used
to set and get per-thread data pointer. When
<strong>pthread_key_create</strong>() completes, the value associated with the
newly created key is NULL.</p>
<p>When a thread terminates, if <strong>both</strong> the value and the
destructor associated with a thread local storage key are not
<strong>NULL</strong>, the destructor function is called. The stored pointer
associated with the key is set to NULL before the call to the destructor
funciton. The parameter passed to the destructor function when it is called is
the value of the pointer before it was set to NULL that is associated with that
key in the thread that is terminating.</p>
<p>After calling the destructors, if there are still non <strong>NULL</strong>
values in the thread associated with the keys, the process is repeated. After
<strong>PTHREAD_DESTRUCTOR_ITERATIONS</strong> attempts to destroy the thread
local storage, no further attempts are made for that thread local storage
value/key combination.</p>
<p>Do not call <strong>pthread_exit</strong>() from a destructor function.</p>
<p>A destructor function is not called as a result of the application calling
<strong>pthread_key_delete</strong>().</p>
<br>
<h3>Authorities and Locks</h3>
<p>None.</p>
<br>
<h3>Parameters</h3>
<dl>
<dt><strong>key</strong></dt>
<dd>(Output) The address of the variable to contain the thread local storage
key<br><br></dd>
<dt><strong>destructor</strong></dt>
<dd>(Input) The address of the function to act as a destructor for this thread
local storage key</dd>
</dl>
<br>
<h3>Return Value</h3>
<dl>
<dt><strong>0</strong></dt>
<dd><strong>pthread_key_create</strong>() was successful.<br><br></dd>
<dt><strong>value</strong></dt>
<dd><strong>pthread_key_create</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_key_create</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>[EAGAIN]</em></dt>
<dd><p>The system did not have enough resources, or the maximum of
<strong>PTHREAD_KEYS_MAX</strong> would have been exceeded.</p></dd>
<dt><em>[ENOMEM]</em></dt>
<dd><p>Not enough memory to create the key.</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_34.htm">pthread_getspecific()</a>--Get Thread Local Storage
Value by Key<br><br></li>
<li><a href="users_36.htm">pthread_key_delete()</a>--Delete Thread Local Storage
Key<br><br></li>
<li><a href="users_37.htm">pthread_setspecific()</a>--Set Thread Local Storage by
Key</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;sched.h&gt;
#include &lt;stdio.h&gt;
#include "check.h"
pthread_key_t tlsKey = 0;
void globalDestructor(void *value)
{
printf("In the data destructor\n");
free(value);
pthread_setspecific(tlsKey, NULL);
}
int main(int argc, char **argv)
{
int rc=0;
int i=0;
printf("Enter Testcase - %s\n", argv[0]);
printf("Create a thread local storage key\n");
rc = pthread_key_create(&amp;tlsKey, globalDestructor);
checkResults("pthread_key_create()\n", rc);
/* The key can now be used from all threads */
printf("- The key can now be used from all threads\n");
printf("- in the process to storage thread local\n");
printf("- (but global to all functions in that thread)\n");
printf("- storage\n");
printf("Delete a thread local storage key\n");
rc = pthread_key_delete(tlsKey);
checkResults("pthread_key_delete()\n", rc);
/* The key and any remaining values are now gone. */
printf("Main completed\n");
return 0;
}
</pre>
<p><strong>Output:</strong></p>
<pre>
Enter Testcase - QP0WTEST/TPKEYC0
Create a thread local storage key
- The key can now be used from all threads
- in the process to storage thread local
- (but global to all functions in that thread)
- storage
Delete a thread local storage key
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>