1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>Thread Local Storage</title> 6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> 7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> 9<link rel="up" href="../thread.html" title="Chapter 39. Thread 4.8.0"> 10<link rel="prev" href="synchronization.html" title="Synchronization"> 11<link rel="next" href="sds.html" title="Synchronized Data Structures"> 12</head> 13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 14<table cellpadding="2" width="100%"><tr> 15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> 16<td align="center"><a href="../../../index.html">Home</a></td> 17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> 18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 20<td align="center"><a href="../../../more/index.htm">More</a></td> 21</tr></table> 22<hr> 23<div class="spirit-nav"> 24<a accesskey="p" href="synchronization.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../thread.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="sds.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 25</div> 26<div class="section"> 27<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 28<a name="thread.thread_local_storage"></a><a class="link" href="thread_local_storage.html" title="Thread Local Storage">Thread Local Storage</a> 29</h2></div></div></div> 30<div class="toc"><dl class="toc"><dt><span class="section"><a href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr">Class 31 <code class="computeroutput"><span class="identifier">thread_specific_ptr</span></code></a></span></dt></dl></div> 32<h4> 33<a name="thread.thread_local_storage.h0"></a> 34 <span class="phrase"><a name="thread.thread_local_storage.synopsis"></a></span><a class="link" href="thread_local_storage.html#thread.thread_local_storage.synopsis">Synopsis</a> 35 </h4> 36<p> 37 Thread local storage allows multi-threaded applications to have a separate 38 instance of a given data item for each thread. Where a single-threaded application 39 would use static or global data, this could lead to contention, deadlock or 40 data corruption in a multi-threaded application. One example is the C <code class="computeroutput"><span class="identifier">errno</span></code> variable, used for storing the error 41 code related to functions from the Standard C library. It is common practice 42 (and required by POSIX) for compilers that support multi-threaded applications 43 to provide a separate instance of <code class="computeroutput"><span class="identifier">errno</span></code> 44 for each thread, in order to avoid different threads competing to read or update 45 the value. 46 </p> 47<p> 48 Though compilers often provide this facility in the form of extensions to the 49 declaration syntax (such as <code class="computeroutput"><span class="identifier">__declspec</span><span class="special">(</span><span class="identifier">thread</span><span class="special">)</span></code> 50 or <code class="computeroutput"><a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a></code> 51 annotations on <code class="computeroutput"><span class="keyword">static</span></code> or namespace-scope 52 variable declarations), such support is non-portable, and is often limited 53 in some way, such as only supporting POD types. 54 </p> 55<h4> 56<a name="thread.thread_local_storage.h1"></a> 57 <span class="phrase"><a name="thread.thread_local_storage.portable_thread_local_storage_with__code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__thread_specific_ptr__phrase___code_"></a></span><a class="link" href="thread_local_storage.html#thread.thread_local_storage.portable_thread_local_storage_with__code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__thread_specific_ptr__phrase___code_">Portable 58 thread-local storage with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_ptr</span></code></a> 59 </h4> 60<p> 61 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_ptr</span></code> provides a portable mechanism 62 for thread-local storage that works on all compilers supported by <span class="bold"><strong>Boost.Thread</strong></span>. Each instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_ptr</span></code> 63 represents a pointer to an object (such as <code class="computeroutput"><span class="identifier">errno</span></code>) 64 where each thread must have a distinct value. The value for the current thread 65 can be obtained using the <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code> member function, or by using the <code class="computeroutput"><span class="special">*</span></code> and <code class="computeroutput"><span class="special">-></span></code> 66 pointer deference operators. Initially the pointer has a value of <code class="computeroutput"><span class="identifier">NULL</span></code> in each thread, but the value for the 67 current thread can be set using the <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code> member function. 68 </p> 69<p> 70 If the value of the pointer for the current thread is changed using <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code>, 71 then the previous value is destroyed by calling the cleanup routine. Alternatively, 72 the stored value can be reset to <code class="computeroutput"><span class="identifier">NULL</span></code> 73 and the prior value returned by calling the <code class="computeroutput"><span class="identifier">release</span><span class="special">()</span></code> member function, allowing the application 74 to take back responsibility for destroying the object. 75 </p> 76<h4> 77<a name="thread.thread_local_storage.h2"></a> 78 <span class="phrase"><a name="thread.thread_local_storage.cleanup_at_thread_exit"></a></span><a class="link" href="thread_local_storage.html#thread.thread_local_storage.cleanup_at_thread_exit">Cleanup 79 at thread exit</a> 80 </h4> 81<p> 82 When a thread exits, the objects associated with each <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_ptr</span></code> 83 instance are destroyed. By default, the object pointed to by a pointer <code class="computeroutput"><span class="identifier">p</span></code> is destroyed by invoking <code class="computeroutput"><span class="keyword">delete</span> <span class="identifier">p</span></code>, 84 but this can be overridden for a specific instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_ptr</span></code> 85 by providing a cleanup routine to the constructor. In this case, the object 86 is destroyed by invoking <code class="computeroutput"><span class="identifier">func</span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code> 87 where <code class="computeroutput"><span class="identifier">func</span></code> is the cleanup routine 88 supplied to the constructor. The cleanup functions are called in an unspecified 89 order. If a cleanup routine sets the value of associated with an instance of 90 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_ptr</span></code> that has already been 91 cleaned up, that value is added to the cleanup list. Cleanup finishes when 92 there are no outstanding instances of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_ptr</span></code> 93 with values. 94 </p> 95<p> 96 Note: on some platforms, cleanup of thread-specific data is not performed for 97 threads created with the platform's native API. On those platforms such cleanup 98 is only done for threads that are started with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> 99 unless <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">on_thread_exit</span><span class="special">()</span></code> 100 is called manually from that thread. 101 </p> 102<h4> 103<a name="thread.thread_local_storage.h3"></a> 104 <span class="phrase"><a name="thread.thread_local_storage.rationale_about_the_nature_of_the_key"></a></span><a class="link" href="thread_local_storage.html#thread.thread_local_storage.rationale_about_the_nature_of_the_key">Rationale 105 about the nature of the key</a> 106 </h4> 107<p> 108 Boost.Thread uses the address of the <code class="computeroutput"><span class="identifier">thread_specific_ptr</span></code> 109 instance as key of the thread specific pointers. This avoids to create/destroy 110 a key which will need a lock to protect from race conditions. This has a little 111 performance liability, as the access must be done using an associative container. 112 </p> 113<div class="section"> 114<div class="titlepage"><div><div><h3 class="title"> 115<a name="thread.thread_local_storage.thread_specific_ptr"></a><a class="link" href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr" title="Class thread_specific_ptr">Class 116 <code class="computeroutput"><span class="identifier">thread_specific_ptr</span></code></a> 117</h3></div></div></div> 118<div class="toc"><dl class="toc"> 119<dt><span class="section"><a href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.default_constructor"><code class="computeroutput"><span class="identifier">thread_specific_ptr</span><span class="special">();</span></code></a></span></dt> 120<dt><span class="section"><a href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.constructor_with_custom_cleanup"><code class="computeroutput"><span class="keyword">explicit</span> <span class="identifier">thread_specific_ptr</span><span class="special">(</span><span class="keyword">void</span> <span class="special">(*</span><span class="identifier">cleanup_function</span><span class="special">)(</span><span class="identifier">T</span><span class="special">*));</span></code></a></span></dt> 121<dt><span class="section"><a href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">thread_specific_ptr</span><span class="special">();</span></code></a></span></dt> 122<dt><span class="section"><a href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.get"><code class="computeroutput"><span class="identifier">T</span><span class="special">*</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span></code></a></span></dt> 123<dt><span class="section"><a href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.operator_arrow"><code class="computeroutput"><span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span></code></a></span></dt> 124<dt><span class="section"><a href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.operator_star"><code class="computeroutput"><span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span></code></a></span></dt> 125<dt><span class="section"><a href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.reset"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> 126 <span class="identifier">new_value</span><span class="special">=</span><span class="number">0</span><span class="special">);</span></code></a></span></dt> 127<dt><span class="section"><a href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.release"><code class="computeroutput"><span class="identifier">T</span><span class="special">*</span> <span class="identifier">release</span><span class="special">();</span></code></a></span></dt> 128</dl></div> 129<pre class="programlisting"><span class="comment">// #include <boost/thread/tss.hpp></span> 130 131<span class="keyword">namespace</span> <span class="identifier">boost</span> 132<span class="special">{</span> 133 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 134 <span class="keyword">class</span> <span class="identifier">thread_specific_ptr</span> 135 <span class="special">{</span> 136 <span class="keyword">public</span><span class="special">:</span> 137 <span class="identifier">thread_specific_ptr</span><span class="special">();</span> 138 <span class="keyword">explicit</span> <span class="identifier">thread_specific_ptr</span><span class="special">(</span><span class="keyword">void</span> <span class="special">(*</span><span class="identifier">cleanup_function</span><span class="special">)(</span><span class="identifier">T</span><span class="special">*));</span> 139 <span class="special">~</span><span class="identifier">thread_specific_ptr</span><span class="special">();</span> 140 141 <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 142 <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span> 143 <span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span> 144 145 <span class="identifier">T</span><span class="special">*</span> <span class="identifier">release</span><span class="special">();</span> 146 <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">new_value</span><span class="special">=</span><span class="number">0</span><span class="special">);</span> 147 <span class="special">};</span> 148<span class="special">}</span> 149</pre> 150<div class="section"> 151<div class="titlepage"><div><div><h4 class="title"> 152<a name="thread.thread_local_storage.thread_specific_ptr.default_constructor"></a><a class="link" href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.default_constructor" title="thread_specific_ptr();"><code class="computeroutput"><span class="identifier">thread_specific_ptr</span><span class="special">();</span></code></a> 153</h4></div></div></div> 154<div class="variablelist"> 155<p class="title"><b></b></p> 156<dl class="variablelist"> 157<dt><span class="term">Requires:</span></dt> 158<dd><p> 159 <code class="computeroutput"><span class="keyword">delete</span> <span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()</span></code> is well-formed. 160 </p></dd> 161<dt><span class="term">Effects:</span></dt> 162<dd><p> 163 Construct a <code class="computeroutput"><span class="identifier">thread_specific_ptr</span></code> 164 object for storing a pointer to an object of type <code class="computeroutput"><span class="identifier">T</span></code> 165 specific to each thread. The default <code class="computeroutput"><span class="keyword">delete</span></code>-based 166 cleanup function will be used to destroy any thread-local objects 167 when <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code> 168 is called, or the thread exits. 169 </p></dd> 170<dt><span class="term">Throws:</span></dt> 171<dd><p> 172 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 173 occurs. 174 </p></dd> 175</dl> 176</div> 177</div> 178<div class="section"> 179<div class="titlepage"><div><div><h4 class="title"> 180<a name="thread.thread_local_storage.thread_specific_ptr.constructor_with_custom_cleanup"></a><a class="link" href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.constructor_with_custom_cleanup" title="explicit thread_specific_ptr(void (*cleanup_function)(T*));"><code class="computeroutput"><span class="keyword">explicit</span> <span class="identifier">thread_specific_ptr</span><span class="special">(</span><span class="keyword">void</span> <span class="special">(*</span><span class="identifier">cleanup_function</span><span class="special">)(</span><span class="identifier">T</span><span class="special">*));</span></code></a> 181</h4></div></div></div> 182<div class="variablelist"> 183<p class="title"><b></b></p> 184<dl class="variablelist"> 185<dt><span class="term">Requires:</span></dt> 186<dd><p> 187 <code class="computeroutput"><span class="identifier">cleanup_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">())</span></code> does not throw any exceptions. 188 </p></dd> 189<dt><span class="term">Effects:</span></dt> 190<dd><p> 191 Construct a <code class="computeroutput"><span class="identifier">thread_specific_ptr</span></code> 192 object for storing a pointer to an object of type <code class="computeroutput"><span class="identifier">T</span></code> 193 specific to each thread. The supplied <code class="computeroutput"><span class="identifier">cleanup_function</span></code> 194 will be used to destroy any thread-local objects when <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code> 195 is called, or the thread exits. 196 </p></dd> 197<dt><span class="term">Throws:</span></dt> 198<dd><p> 199 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 200 occurs. 201 </p></dd> 202</dl> 203</div> 204</div> 205<div class="section"> 206<div class="titlepage"><div><div><h4 class="title"> 207<a name="thread.thread_local_storage.thread_specific_ptr.destructor"></a><a class="link" href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.destructor" title="~thread_specific_ptr();"><code class="computeroutput"><span class="special">~</span><span class="identifier">thread_specific_ptr</span><span class="special">();</span></code></a> 208</h4></div></div></div> 209<div class="variablelist"> 210<p class="title"><b></b></p> 211<dl class="variablelist"> 212<dt><span class="term">Requires:</span></dt> 213<dd><p> 214 All the thread specific instances associated to this thread_specific_ptr 215 (except maybe the one associated to this thread) must be null. 216 </p></dd> 217<dt><span class="term">Effects:</span></dt> 218<dd><p> 219 Calls <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">reset</span><span class="special">()</span></code> 220 to clean up the associated value for the current thread, and destroys 221 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 222 </p></dd> 223<dt><span class="term">Throws:</span></dt> 224<dd><p> 225 Nothing. 226 </p></dd> 227<dt><span class="term">Remarks:</span></dt> 228<dd><p> 229 The requirement is due to the fact that in order to delete all these 230 instances, the implementation should be forced to maintain a list 231 of all the threads having an associated specific ptr, which is against 232 the goal of thread specific data. 233 </p></dd> 234</dl> 235</div> 236<div class="note"><table border="0" summary="Note"> 237<tr> 238<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 239<th align="left">Note</th> 240</tr> 241<tr><td align="left" valign="top"><p> 242 Care needs to be taken to ensure that any threads still running after 243 an instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_ptr</span></code> 244 has been destroyed do not call any member functions on that instance. 245 </p></td></tr> 246</table></div> 247</div> 248<div class="section"> 249<div class="titlepage"><div><div><h4 class="title"> 250<a name="thread.thread_local_storage.thread_specific_ptr.get"></a><a class="link" href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.get" title="T* get() const;"><code class="computeroutput"><span class="identifier">T</span><span class="special">*</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span></code></a> 251</h4></div></div></div> 252<div class="variablelist"> 253<p class="title"><b></b></p> 254<dl class="variablelist"> 255<dt><span class="term">Returns:</span></dt> 256<dd><p> 257 The pointer associated with the current thread. 258 </p></dd> 259<dt><span class="term">Throws:</span></dt> 260<dd><p> 261 Nothing. 262 </p></dd> 263</dl> 264</div> 265<div class="note"><table border="0" summary="Note"> 266<tr> 267<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 268<th align="left">Note</th> 269</tr> 270<tr><td align="left" valign="top"><p> 271 The initial value associated with an instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_specific_ptr</span></code> 272 is <code class="computeroutput"><span class="identifier">NULL</span></code> for each thread. 273 </p></td></tr> 274</table></div> 275</div> 276<div class="section"> 277<div class="titlepage"><div><div><h4 class="title"> 278<a name="thread.thread_local_storage.thread_specific_ptr.operator_arrow"></a><a class="link" href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.operator_arrow" title="T* operator->() const;"><code class="computeroutput"><span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span></code></a> 279</h4></div></div></div> 280<div class="variablelist"> 281<p class="title"><b></b></p> 282<dl class="variablelist"> 283<dt><span class="term">Returns:</span></dt> 284<dd><p> 285 <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()</span></code> 286 </p></dd> 287<dt><span class="term">Throws:</span></dt> 288<dd><p> 289 Nothing. 290 </p></dd> 291</dl> 292</div> 293</div> 294<div class="section"> 295<div class="titlepage"><div><div><h4 class="title"> 296<a name="thread.thread_local_storage.thread_specific_ptr.operator_star"></a><a class="link" href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.operator_star" title="T& operator*() const;"><code class="computeroutput"><span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span></code></a> 297</h4></div></div></div> 298<div class="variablelist"> 299<p class="title"><b></b></p> 300<dl class="variablelist"> 301<dt><span class="term">Requires:</span></dt> 302<dd><p> 303 <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span></code> is not <code class="computeroutput"><span class="identifier">NULL</span></code>. 304 </p></dd> 305<dt><span class="term">Returns:</span></dt> 306<dd><p> 307 <code class="computeroutput"><span class="special">*(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">())</span></code> 308 </p></dd> 309<dt><span class="term">Throws:</span></dt> 310<dd><p> 311 Nothing. 312 </p></dd> 313</dl> 314</div> 315</div> 316<div class="section"> 317<div class="titlepage"><div><div><h4 class="title"> 318<a name="thread.thread_local_storage.thread_specific_ptr.reset"></a><a class="link" href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.reset" title="void reset(T* new_value=0);"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> 319 <span class="identifier">new_value</span><span class="special">=</span><span class="number">0</span><span class="special">);</span></code></a> 320</h4></div></div></div> 321<div class="variablelist"> 322<p class="title"><b></b></p> 323<dl class="variablelist"> 324<dt><span class="term">Effects:</span></dt> 325<dd><p> 326 If <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()!=</span><span class="identifier">new_value</span></code> and <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()</span></code> is non-<code class="computeroutput"><span class="identifier">NULL</span></code>, 327 invoke <code class="computeroutput"><span class="keyword">delete</span> <span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">cleanup_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">())</span></code> as appropriate. Store <code class="computeroutput"><span class="identifier">new_value</span></code> as the pointer associated 328 with the current thread. 329 </p></dd> 330<dt><span class="term">Postcondition:</span></dt> 331<dd><p> 332 <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()==</span><span class="identifier">new_value</span></code> 333 </p></dd> 334<dt><span class="term">Throws:</span></dt> 335<dd><p> 336 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 337 occurs. 338 </p></dd> 339</dl> 340</div> 341</div> 342<div class="section"> 343<div class="titlepage"><div><div><h4 class="title"> 344<a name="thread.thread_local_storage.thread_specific_ptr.release"></a><a class="link" href="thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr.release" title="T* release();"><code class="computeroutput"><span class="identifier">T</span><span class="special">*</span> <span class="identifier">release</span><span class="special">();</span></code></a> 345</h4></div></div></div> 346<div class="variablelist"> 347<p class="title"><b></b></p> 348<dl class="variablelist"> 349<dt><span class="term">Effects:</span></dt> 350<dd><p> 351 Return <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()</span></code> 352 and store <code class="computeroutput"><span class="identifier">NULL</span></code> as 353 the pointer associated with the current thread without invoking the 354 cleanup function. 355 </p></dd> 356<dt><span class="term">Postcondition:</span></dt> 357<dd><p> 358 <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get</span><span class="special">()==</span><span class="number">0</span></code> 359 </p></dd> 360<dt><span class="term">Throws:</span></dt> 361<dd><p> 362 Nothing. 363 </p></dd> 364</dl> 365</div> 366</div> 367</div> 368</div> 369<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 370<td align="left"></td> 371<td align="right"><div class="copyright-footer">Copyright © 2007 -11 Anthony Williams<br>Copyright © 2011 -17 Vicente J. Botet Escriba<p> 372 Distributed under the Boost Software License, Version 1.0. (See accompanying 373 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) 374 </p> 375</div></td> 376</tr></table> 377<hr> 378<div class="spirit-nav"> 379<a accesskey="p" href="synchronization.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../thread.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="sds.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 380</div> 381</body> 382</html> 383