3 <meta http-equiv=
"Content-Type" content=
"text/html; charset=US-ASCII">
4 <title>Fiber local storage
</title>
5 <link rel=
"stylesheet" href=
"../../../../../doc/src/boostbook.css" type=
"text/css">
6 <meta name=
"generator" content=
"DocBook XSL Stylesheets V1.75.2">
7 <link rel=
"home" href=
"../index.html" title=
"Chapter 1. Fiber">
8 <link rel=
"up" href=
"../index.html" title=
"Chapter 1. Fiber">
9 <link rel=
"prev" href=
"synchronization/futures/packaged_task.html" title=
"Template packaged_task<>">
10 <link rel=
"next" href=
"migration.html" title=
"Migrating fibers between threads">
12 <body bgcolor=
"white" text=
"black" link=
"#0000FF" vlink=
"#840084" alink=
"#0000FF">
13 <table cellpadding=
"2" width=
"100%"><tr>
14 <td valign=
"top"><img alt=
"Boost C++ Libraries" width=
"277" height=
"86" src=
"../../../../../boost.png"></td>
15 <td align=
"center"><a href=
"../../../../../index.html">Home
</a></td>
16 <td align=
"center"><a href=
"../../../../../libs/libraries.htm">Libraries
</a></td>
17 <td align=
"center"><a href=
"http://www.boost.org/users/people.html">People
</a></td>
18 <td align=
"center"><a href=
"http://www.boost.org/users/faq.html">FAQ
</a></td>
19 <td align=
"center"><a href=
"../../../../../more/index.htm">More
</a></td>
22 <div class=
"spirit-nav">
23 <a accesskey=
"p" href=
"synchronization/futures/packaged_task.html"><img src=
"../../../../../doc/src/images/prev.png" alt=
"Prev"></a><a accesskey=
"u" href=
"../index.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=
"migration.html"><img src=
"../../../../../doc/src/images/next.png" alt=
"Next"></a>
26 <div class=
"titlepage"><div><div><h2 class=
"title" style=
"clear: both">
27 <a name=
"fiber.fls"></a><a class=
"link" href=
"fls.html" title=
"Fiber local storage">Fiber local storage
</a>
28 </h2></div></div></div>
30 <a name=
"fiber.fls.h0"></a>
31 <span><a name=
"fiber.fls.synopsis"></a></span><a class=
"link" href=
"fls.html#fiber.fls.synopsis">Synopsis
</a>
34 Fiber local storage allows a separate instance of a given data item for each
38 <a name=
"fiber.fls.h1"></a>
39 <span><a name=
"fiber.fls.cleanup_at_fiber_exit"></a></span><a class=
"link" href=
"fls.html#fiber.fls.cleanup_at_fiber_exit">Cleanup
43 When a fiber exits, the objects associated with each
<a class=
"link" href=
"fls.html#class_fiber_specific_ptr"><code class=
"computeroutput">fiber_specific_ptr
</code></a> instance
44 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>,
45 but this can be overridden for a specific instance of
<a class=
"link" href=
"fls.html#class_fiber_specific_ptr"><code class=
"computeroutput">fiber_specific_ptr
</code></a> by
46 providing a cleanup routine
<code class=
"computeroutput"><span class=
"identifier">func
</span></code>
47 to the constructor. In this case, the object 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>. The cleanup functions are called in an unspecified
53 <a name=
"class_fiber_specific_ptr_bridgehead"></a>
54 <span><a name=
"class_fiber_specific_ptr"></a></span>
55 <a class=
"link" href=
"fls.html#class_fiber_specific_ptr">Class
56 <code class=
"computeroutput">fiber_specific_ptr
</code></a>
60 <pre class=
"programlisting"><span class=
"preprocessor">#include
</span> <span class=
"special"><</span><span class=
"identifier">boost
</span><span class=
"special">/
</span><span class=
"identifier">fiber
</span><span class=
"special">/
</span><span class=
"identifier">fss
</span><span class=
"special">.
</span><span class=
"identifier">hpp
</span><span class=
"special">></span>
62 <span class=
"keyword">namespace
</span> <span class=
"identifier">boost
</span> <span class=
"special">{
</span>
63 <span class=
"keyword">namespace
</span> <span class=
"identifier">fibers
</span> <span class=
"special">{
</span>
65 <span class=
"keyword">template
</span><span class=
"special"><</span> <span class=
"keyword">typename
</span> <span class=
"identifier">T
</span> <span class=
"special">></span>
66 <span class=
"keyword">class
</span> <span class=
"identifier">fiber_specific_ptr
</span> <span class=
"special">{
</span>
67 <span class=
"keyword">public
</span><span class=
"special">:
</span>
68 <span class=
"keyword">typedef
</span> <span class=
"identifier">T
</span> <span class=
"identifier">element_type
</span><span class=
"special">;
</span>
70 <span class=
"identifier">fiber_specific_ptr
</span><span class=
"special">();
</span>
72 <span class=
"keyword">explicit
</span> <span class=
"identifier">fiber_specific_ptr
</span><span class=
"special">(
</span> <span class=
"keyword">void
</span><span class=
"special">(*
</span><span class=
"identifier">fn
</span><span class=
"special">)(
</span><span class=
"identifier">T
</span><span class=
"special">*)
</span> <span class=
"special">);
</span>
74 <span class=
"special">~
</span><span class=
"identifier">fiber_specific_ptr
</span><span class=
"special">();
</span>
76 <span class=
"identifier">fiber_specific_ptr
</span><span class=
"special">(
</span> <span class=
"identifier">fiber_specific_ptr
</span> <span class=
"keyword">const
</span><span class=
"special">&)
</span> <span class=
"special">=
</span> <span class=
"keyword">delete
</span><span class=
"special">;
</span>
77 <span class=
"identifier">fiber_specific_ptr
</span> <span class=
"special">&</span> <span class=
"keyword">operator
</span><span class=
"special">=(
</span> <span class=
"identifier">fiber_specific_ptr
</span> <span class=
"keyword">const
</span><span class=
"special">&)
</span> <span class=
"special">=
</span> <span class=
"keyword">delete
</span><span class=
"special">;
</span>
79 <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=
"keyword">noexcept
</span><span class=
"special">;
</span>
81 <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=
"keyword">noexcept
</span><span class=
"special">;
</span>
83 <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=
"keyword">noexcept
</span><span class=
"special">;
</span>
85 <span class=
"identifier">T
</span> <span class=
"special">*
</span> <span class=
"identifier">release
</span><span class=
"special">();
</span>
87 <span class=
"keyword">void
</span> <span class=
"identifier">reset
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span> <span class=
"special">*);
</span>
88 <span class=
"special">};
</span>
90 <span class=
"special">}}
</span>
93 <a name=
"fiber.fls.h2"></a>
94 <span><a name=
"fiber.fls.constructor"></a></span><a class=
"link" href=
"fls.html#fiber.fls.constructor">Constructor
</a>
96 <pre class=
"programlisting"><span class=
"identifier">fiber_specific_ptr
</span><span class=
"special">();
</span>
97 <span class=
"keyword">explicit
</span> <span class=
"identifier">fiber_specific_ptr
</span><span class=
"special">(
</span> <span class=
"keyword">void
</span><span class=
"special">(*
</span><span class=
"identifier">fn
</span><span class=
"special">)(
</span><span class=
"identifier">T
</span><span class=
"special">*)
</span> <span class=
"special">);
</span>
99 <div class=
"variablelist">
100 <p class=
"title"><b></b></p>
102 <dt><span class=
"term">Requires:
</span></dt>
104 <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;
<code class=
"computeroutput"><span class=
"identifier">fn
</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
106 <dt><span class=
"term">Effects:
</span></dt>
108 Construct a
<a class=
"link" href=
"fls.html#class_fiber_specific_ptr"><code class=
"computeroutput">fiber_specific_ptr
</code></a> object for storing
109 a pointer to an object of type
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>
110 specific to each fiber. When
<code class=
"computeroutput"><span class=
"identifier">reset
</span><span class=
"special">()
</span></code> is called, or the fiber exits,
<a class=
"link" href=
"fls.html#class_fiber_specific_ptr"><code class=
"computeroutput">fiber_specific_ptr
</code></a> calls
111 <code class=
"computeroutput"><span class=
"identifier">fn
</span><span class=
"special">(
</span><span class=
"keyword">this
</span><span class=
"special">-
></span><span class=
"identifier">get
</span><span class=
"special">())
</span></code>.
112 If the no-arguments constructor is used, the default
<code class=
"computeroutput"><span class=
"keyword">delete
</span></code>-based
113 cleanup function will be used to destroy the fiber-local objects.
115 <dt><span class=
"term">Throws:
</span></dt>
117 <code class=
"computeroutput"><span class=
"identifier">fiber_error
</span></code> if an error
123 <a name=
"fiber.fls.h3"></a>
124 <span><a name=
"fiber.fls.destructor"></a></span><a class=
"link" href=
"fls.html#fiber.fls.destructor">Destructor
</a>
126 <pre class=
"programlisting"><span class=
"special">~
</span><span class=
"identifier">fiber_specific_ptr
</span><span class=
"special">();
</span>
128 <div class=
"variablelist">
129 <p class=
"title"><b></b></p>
131 <dt><span class=
"term">Requires:
</span></dt>
133 All the fiber specific instances associated to this
<a class=
"link" href=
"fls.html#class_fiber_specific_ptr"><code class=
"computeroutput">fiber_specific_ptr
</code></a>
135 maybe the one associated to this fiber) must be nullptr.
137 <dt><span class=
"term">Effects:
</span></dt>
139 Calls
<code class=
"computeroutput"><span class=
"keyword">this
</span><span class=
"special">-
></span><span class=
"identifier">reset
</span><span class=
"special">()
</span></code>
140 to clean up the associated value for the current fiber, and destroys
141 <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>.
143 <dt><span class=
"term">Remarks:
</span></dt>
145 The requirement is an implementation restriction. If the destructor promised
146 to delete instances for all fibers, the implementation would be forced
147 to maintain a list of all the fibers having an associated specific ptr,
148 which is against the goal of fiber specific data. In general, a
<a class=
"link" href=
"fls.html#class_fiber_specific_ptr"><code class=
"computeroutput">fiber_specific_ptr
</code></a> should
149 outlive the fibers that use it.
153 <div class=
"note"><table border=
"0" summary=
"Note">
155 <td rowspan=
"2" align=
"center" valign=
"top" width=
"25"><img alt=
"[Note]" src=
"../../../../../doc/src/images/note.png"></td>
156 <th align=
"left">Note
</th>
158 <tr><td align=
"left" valign=
"top"><p>
159 Care needs to be taken to ensure that any fibers still running after an instance
160 of
<a class=
"link" href=
"fls.html#class_fiber_specific_ptr"><code class=
"computeroutput">fiber_specific_ptr
</code></a> has been destroyed do not call
161 any member functions on that instance.
167 <a name=
"fiber_specific_ptr_get_bridgehead"></a>
168 <span><a name=
"fiber_specific_ptr_get"></a></span>
169 <a class=
"link" href=
"fls.html#fiber_specific_ptr_get">Member
170 function
<code class=
"computeroutput">get
</code>()
</a>
174 <pre class=
"programlisting"><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=
"keyword">noexcept
</span><span class=
"special">;
</span>
176 <div class=
"variablelist">
177 <p class=
"title"><b></b></p>
179 <dt><span class=
"term">Returns:
</span></dt>
181 The pointer associated with the current fiber.
183 <dt><span class=
"term">Throws:
</span></dt>
189 <div class=
"note"><table border=
"0" summary=
"Note">
191 <td rowspan=
"2" align=
"center" valign=
"top" width=
"25"><img alt=
"[Note]" src=
"../../../../../doc/src/images/note.png"></td>
192 <th align=
"left">Note
</th>
194 <tr><td align=
"left" valign=
"top"><p>
195 The initial value associated with an instance of
<a class=
"link" href=
"fls.html#class_fiber_specific_ptr"><code class=
"computeroutput">fiber_specific_ptr
</code></a> is
196 <code class=
"computeroutput"><span class=
"keyword">nullptr
</span></code> for each fiber.
202 <a name=
"fiber_specific_ptr_operator_arrow_bridgehead"></a>
203 <span><a name=
"fiber_specific_ptr_operator_arrow"></a></span>
204 <a class=
"link" href=
"fls.html#fiber_specific_ptr_operator_arrow">Member
205 function
<code class=
"computeroutput">operator-
></code>()
</a>
209 <pre class=
"programlisting"><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=
"keyword">noexcept
</span><span class=
"special">;
</span>
211 <div class=
"variablelist">
212 <p class=
"title"><b></b></p>
214 <dt><span class=
"term">Requires:
</span></dt>
216 <code class=
"computeroutput"><span class=
"keyword">this
</span><span class=
"special">-
></span><span class=
"identifier">get
</span><span class=
"special">()
</span></code>
217 is not
<code class=
"computeroutput"><span class=
"keyword">nullptr
</span></code>.
219 <dt><span class=
"term">Returns:
</span></dt>
221 <code class=
"computeroutput"><span class=
"keyword">this
</span><span class=
"special">-
></span><span class=
"identifier">get
</span><span class=
"special">()
</span></code>
223 <dt><span class=
"term">Throws:
</span></dt>
232 <a name=
"fiber_specific_ptr_operator_star_bridgehead"></a>
233 <span><a name=
"fiber_specific_ptr_operator_star"></a></span>
234 <a class=
"link" href=
"fls.html#fiber_specific_ptr_operator_star">Member
235 function
<code class=
"computeroutput">operator*
</code>()
</a>
239 <pre class=
"programlisting"><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=
"keyword">noexcept
</span><span class=
"special">;
</span>
241 <div class=
"variablelist">
242 <p class=
"title"><b></b></p>
244 <dt><span class=
"term">Requires:
</span></dt>
246 <code class=
"computeroutput"><span class=
"keyword">this
</span><span class=
"special">-
></span><span class=
"identifier">get
</span><span class=
"special">()
</span></code>
247 is not
<code class=
"computeroutput"><span class=
"keyword">nullptr
</span></code>.
249 <dt><span class=
"term">Returns:
</span></dt>
251 <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>
253 <dt><span class=
"term">Throws:
</span></dt>
262 <a name=
"fiber_specific_ptr_release_bridgehead"></a>
263 <span><a name=
"fiber_specific_ptr_release"></a></span>
264 <a class=
"link" href=
"fls.html#fiber_specific_ptr_release">Member
265 function
<code class=
"computeroutput">release
</code>()
</a>
269 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"special">*
</span> <span class=
"identifier">release
</span><span class=
"special">();
</span>
271 <div class=
"variablelist">
272 <p class=
"title"><b></b></p>
274 <dt><span class=
"term">Effects:
</span></dt>
276 Return
<code class=
"computeroutput"><span class=
"keyword">this
</span><span class=
"special">-
></span><span class=
"identifier">get
</span><span class=
"special">()
</span></code>
277 and store
<code class=
"computeroutput"><span class=
"keyword">nullptr
</span></code> as the
278 pointer associated with the current fiber without invoking the cleanup
281 <dt><span class=
"term">Postcondition:
</span></dt>
283 <code class=
"computeroutput"><span class=
"keyword">this
</span><span class=
"special">-
></span><span class=
"identifier">get
</span><span class=
"special">()==
</span><span class=
"keyword">nullptr
</span></code>
285 <dt><span class=
"term">Throws:
</span></dt>
294 <a name=
"fiber_specific_ptr_reset_bridgehead"></a>
295 <span><a name=
"fiber_specific_ptr_reset"></a></span>
296 <a class=
"link" href=
"fls.html#fiber_specific_ptr_reset">Member
297 function
<code class=
"computeroutput">reset
</code>()
</a>
301 <pre class=
"programlisting"><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>
303 <div class=
"variablelist">
304 <p class=
"title"><b></b></p>
306 <dt><span class=
"term">Effects:
</span></dt>
308 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 not
<code class=
"computeroutput"><span class=
"keyword">nullptr
</span></code>,
309 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">fn
</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
310 with the current fiber.
312 <dt><span class=
"term">Postcondition:
</span></dt>
314 <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>
316 <dt><span class=
"term">Throws:
</span></dt>
318 Exception raised during cleanup of previous value.
323 <table xmlns:
rev=
"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width=
"100%"><tr>
324 <td align=
"left"></td>
325 <td align=
"right"><div class=
"copyright-footer">Copyright
© 2013 Oliver Kowalke
<p>
326 Distributed under the Boost Software License, Version
1.0. (See accompanying
327 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>)
332 <div class=
"spirit-nav">
333 <a accesskey=
"p" href=
"synchronization/futures/packaged_task.html"><img src=
"../../../../../doc/src/images/prev.png" alt=
"Prev"></a><a accesskey=
"u" href=
"../index.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=
"migration.html"><img src=
"../../../../../doc/src/images/next.png" alt=
"Next"></a>