1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
5 <title>Programming interfaces</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="../atomic.html" title="Chapter 7. Boost.Atomic">
10 <link rel="prev" href="thread_coordination.html" title="Thread coordination using Boost.Atomic">
11 <link rel="next" href="usage_examples.html" title="Usage examples">
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>
23 <div class="spirit-nav">
24 <a accesskey="p" href="thread_coordination.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../atomic.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="usage_examples.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
27 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
28 <a name="atomic.interface"></a><a class="link" href="interface.html" title="Programming interfaces">Programming interfaces</a>
29 </h2></div></div></div>
30 <div class="toc"><dl class="toc">
31 <dt><span class="section"><a href="interface.html#atomic.interface.configuration">Configuration and building</a></span></dt>
32 <dt><span class="section"><a href="interface.html#atomic.interface.interface_memory_order">Memory order</a></span></dt>
33 <dt><span class="section"><a href="interface.html#atomic.interface.interface_atomic_object">Atomic objects</a></span></dt>
34 <dt><span class="section"><a href="interface.html#atomic.interface.interface_fences">Fences</a></span></dt>
35 <dt><span class="section"><a href="interface.html#atomic.interface.feature_macros">Feature testing macros</a></span></dt>
38 <div class="titlepage"><div><div><h3 class="title">
39 <a name="atomic.interface.configuration"></a><a class="link" href="interface.html#atomic.interface.configuration" title="Configuration and building">Configuration and building</a>
40 </h3></div></div></div>
42 The library contains header-only and compiled parts. The library is header-only
43 for lock-free cases but requires a separate binary to implement the lock-based
44 emulation. Users are able to detect whether linking to the compiled part
45 is required by checking the <a class="link" href="interface.html#atomic.interface.feature_macros" title="Feature testing macros">feature
49 The following macros affect library behavior:
51 <div class="informaltable"><table class="table">
72 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_NO_CMPXCHG8B</span></code>
77 Affects 32-bit x86 Oracle Studio builds. When defined, the library
78 assumes the target CPU does not support <code class="computeroutput"><span class="identifier">cmpxchg8b</span></code>
79 instruction used to support 64-bit atomic operations. This is the
80 case with very old CPUs (pre-Pentium). The library does not perform
81 runtime detection of this instruction, so running the code that
82 uses 64-bit atomics on such CPUs will result in crashes, unless
83 this macro is defined. Note that the macro does not affect MSVC,
84 GCC and compatible compilers because the library infers this information
85 from the compiler-defined macros.
92 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_NO_CMPXCHG16B</span></code>
97 Affects 64-bit x86 MSVC and Oracle Studio builds. When defined,
98 the library assumes the target CPU does not support <code class="computeroutput"><span class="identifier">cmpxchg16b</span></code> instruction used to
99 support 128-bit atomic operations. This is the case with some early
100 64-bit AMD CPUs, all Intel CPUs and current AMD CPUs support this
101 instruction. The library does not perform runtime detection of
102 this instruction, so running the code that uses 128-bit atomics
103 on such CPUs will result in crashes, unless this macro is defined.
104 Note that the macro does not affect GCC and compatible compilers
105 because the library infers this information from the compiler-defined
113 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_NO_MFENCE</span></code>
118 Affects 32-bit x86 Oracle Studio builds. When defined, the library
119 assumes the target CPU does not support <code class="computeroutput"><span class="identifier">mfence</span></code>
120 instruction used to implement thread fences. This instruction was
121 added with SSE2 instruction set extension, which was available
122 in CPUs since Intel Pentium 4. The library does not perform runtime
123 detection of this instruction, so running the library code on older
124 CPUs will result in crashes, unless this macro is defined. Note
125 that the macro does not affect MSVC, GCC and compatible compilers
126 because the library infers this information from the compiler-defined
134 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_FORCE_FALLBACK</span></code>
139 When defined, all operations are implemented with locks. This is
140 mostly used for testing and should not be used in real world projects.
147 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_DYN_LINK</span></code>
148 and <code class="computeroutput"><span class="identifier">BOOST_ALL_DYN_LINK</span></code>
153 Control library linking. If defined, the library assumes dynamic
154 linking, otherwise static. The latter macro affects all Boost libraries,
155 not just <span class="bold"><strong>Boost.Atomic</strong></span>.
162 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_NO_LIB</span></code>
163 and <code class="computeroutput"><span class="identifier">BOOST_ALL_NO_LIB</span></code>
168 Control library auto-linking on Windows. When defined, disables
169 auto-linking. The latter macro affects all Boost libraries, not
170 just <span class="bold"><strong>Boost.Atomic</strong></span>.
177 Besides macros, it is important to specify the correct compiler options for
178 the target CPU. With GCC and compatible compilers this affects whether particular
179 atomic operations are lock-free or not.
182 Boost building process is described in the <a href="http://www.boost.org/doc/libs/release/more/getting_started/" target="_top">Getting
183 Started guide</a>. For example, you can build <span class="bold"><strong>Boost.Atomic</strong></span>
184 with the following command line:
186 <pre class="programlisting">bjam --with-atomic variant=release instruction-set=core2 stage
189 <div class="section">
190 <div class="titlepage"><div><div><h3 class="title">
191 <a name="atomic.interface.interface_memory_order"></a><a class="link" href="interface.html#atomic.interface.interface_memory_order" title="Memory order">Memory order</a>
192 </h3></div></div></div>
193 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">memory_order</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
196 The enumeration <code class="literal">boost::memory_order</code> defines the following
197 values to represent memory ordering constraints:
199 <div class="informaltable"><table class="table">
220 <code class="computeroutput"><span class="identifier">memory_order_relaxed</span></code>
225 No ordering constraint. Informally speaking, following operations
226 may be reordered before, preceding operations may be reordered
227 after the atomic operation. This constraint is suitable only when
228 either a) further operations do not depend on the outcome of the
229 atomic operation or b) ordering is enforced through stand-alone
230 <code class="computeroutput"><span class="identifier">atomic_thread_fence</span></code>
231 operations. The operation on the atomic value itself is still atomic
239 <code class="computeroutput"><span class="identifier">memory_order_release</span></code>
244 Perform <code class="computeroutput"><span class="identifier">release</span></code>
245 operation. Informally speaking, prevents all preceding memory operations
246 to be reordered past this point.
253 <code class="computeroutput"><span class="identifier">memory_order_acquire</span></code>
258 Perform <code class="computeroutput"><span class="identifier">acquire</span></code>
259 operation. Informally speaking, prevents succeeding memory operations
260 to be reordered before this point.
267 <code class="computeroutput"><span class="identifier">memory_order_consume</span></code>
272 Perform <code class="computeroutput"><span class="identifier">consume</span></code>
273 operation. More relaxed (and on some architectures more efficient)
274 than <code class="computeroutput"><span class="identifier">memory_order_acquire</span></code>
275 as it only affects succeeding operations that are computationally-dependent
276 on the value retrieved from an atomic variable.
283 <code class="computeroutput"><span class="identifier">memory_order_acq_rel</span></code>
288 Perform both <code class="computeroutput"><span class="identifier">release</span></code>
289 and <code class="computeroutput"><span class="identifier">acquire</span></code> operation
296 <code class="computeroutput"><span class="identifier">memory_order_seq_cst</span></code>
301 Enforce sequential consistency. Implies <code class="computeroutput"><span class="identifier">memory_order_acq_rel</span></code>,
302 but additionally enforces total order for all operations such qualified.
309 See section <a class="link" href="thread_coordination.html" title="Thread coordination using Boost.Atomic"><span class="emphasis"><em>happens-before</em></span></a>
310 for explanation of the various ordering constraints.
313 <div class="section">
314 <div class="titlepage"><div><div><h3 class="title">
315 <a name="atomic.interface.interface_atomic_object"></a><a class="link" href="interface.html#atomic.interface.interface_atomic_object" title="Atomic objects">Atomic objects</a>
316 </h3></div></div></div>
317 <div class="toc"><dl class="toc">
318 <dt><span class="section"><a href="interface.html#atomic.interface.interface_atomic_object.interface_atomic_generic"><code class="literal">boost::atomic<<span class="emphasis"><em>T</em></span>></code>
319 template class</a></span></dt>
320 <dt><span class="section"><a href="interface.html#atomic.interface.interface_atomic_object.interface_atomic_integral"><code class="literal">boost::atomic<<span class="emphasis"><em>integral</em></span>></code>
321 template class</a></span></dt>
322 <dt><span class="section"><a href="interface.html#atomic.interface.interface_atomic_object.interface_atomic_pointer"><code class="literal">boost::atomic<<span class="emphasis"><em>pointer</em></span>></code>
323 template class</a></span></dt>
325 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">atomic</span><span class="special">/</span><span class="identifier">atomic</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
328 <code class="literal">boost::atomic<<span class="emphasis"><em>T</em></span>></code> provides methods
329 for atomically accessing variables of a suitable type <code class="literal"><span class="emphasis"><em>T</em></span></code>.
330 The type is suitable if it is <span class="emphasis"><em>trivially copyable</em></span> (3.9/9
331 [basic.types]). Following are examples of the types compatible with this
334 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
335 <li class="listitem">
336 a scalar type (e.g. integer, boolean, enum or pointer type)
338 <li class="listitem">
339 a <code class="literal">class</code> or <code class="literal">struct</code> that has no non-trivial
340 copy or move constructors or assignment operators, has a trivial destructor,
341 and that is comparable via <code class="literal">memcmp</code>.
345 Note that classes with virtual functions or virtual base classes do not satisfy
346 the requirements. Also be warned that structures with "padding"
347 between data members may compare non-equal via <code class="literal">memcmp</code>
348 even though all members are equal.
350 <div class="section">
351 <div class="titlepage"><div><div><h4 class="title">
352 <a name="atomic.interface.interface_atomic_object.interface_atomic_generic"></a><a class="link" href="interface.html#atomic.interface.interface_atomic_object.interface_atomic_generic" title="boost::atomic<T> template class"><code class="literal">boost::atomic<<span class="emphasis"><em>T</em></span>></code>
354 </h4></div></div></div>
356 All atomic objects supports the following operations:
358 <div class="informaltable"><table class="table">
379 <code class="computeroutput"><span class="identifier">atomic</span><span class="special">()</span></code>
384 Initialize to an unspecified value
391 <code class="computeroutput"><span class="identifier">atomic</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">initial_value</span><span class="special">)</span></code>
396 Initialize to <code class="literal">initial_value</code>
403 <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">is_lock_free</span><span class="special">()</span></code>
408 Checks if the atomic object is lock-free
415 <code class="computeroutput"><span class="identifier">T</span> <span class="identifier">load</span><span class="special">(</span><span class="identifier">memory_order</span>
416 <span class="identifier">order</span><span class="special">)</span></code>
428 <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">store</span><span class="special">(</span><span class="identifier">T</span>
429 <span class="identifier">value</span><span class="special">,</span>
430 <span class="identifier">memory_order</span> <span class="identifier">order</span><span class="special">)</span></code>
435 Write new value to atomic variable
442 <code class="computeroutput"><span class="identifier">T</span> <span class="identifier">exchange</span><span class="special">(</span><span class="identifier">T</span>
443 <span class="identifier">new_value</span><span class="special">,</span>
444 <span class="identifier">memory_order</span> <span class="identifier">order</span><span class="special">)</span></code>
449 Exchange current value with <code class="computeroutput"><span class="identifier">new_value</span></code>,
450 returning current value
457 <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">compare_exchange_weak</span><span class="special">(</span><span class="identifier">T</span>
458 <span class="special">&</span> <span class="identifier">expected</span><span class="special">,</span> <span class="identifier">T</span>
459 <span class="identifier">desired</span><span class="special">,</span>
460 <span class="identifier">memory_order</span> <span class="identifier">order</span><span class="special">)</span></code>
465 Compare current value with <code class="computeroutput"><span class="identifier">expected</span></code>,
466 change it to <code class="computeroutput"><span class="identifier">desired</span></code>
467 if matches. Returns <code class="computeroutput"><span class="keyword">true</span></code>
468 if an exchange has been performed, and always writes the previous
469 value back in <code class="computeroutput"><span class="identifier">expected</span></code>.
470 May fail spuriously, so must generally be retried in a loop.
477 <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">compare_exchange_weak</span><span class="special">(</span><span class="identifier">T</span>
478 <span class="special">&</span> <span class="identifier">expected</span><span class="special">,</span> <span class="identifier">T</span>
479 <span class="identifier">desired</span><span class="special">,</span>
480 <span class="identifier">memory_order</span> <span class="identifier">success_order</span><span class="special">,</span> <span class="identifier">memory_order</span>
481 <span class="identifier">failure_order</span><span class="special">)</span></code>
486 Compare current value with <code class="computeroutput"><span class="identifier">expected</span></code>,
487 change it to <code class="computeroutput"><span class="identifier">desired</span></code>
488 if matches. Returns <code class="computeroutput"><span class="keyword">true</span></code>
489 if an exchange has been performed, and always writes the previous
490 value back in <code class="computeroutput"><span class="identifier">expected</span></code>.
491 May fail spuriously, so must generally be retried in a loop.
498 <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">compare_exchange_strong</span><span class="special">(</span><span class="identifier">T</span>
499 <span class="special">&</span> <span class="identifier">expected</span><span class="special">,</span> <span class="identifier">T</span>
500 <span class="identifier">desired</span><span class="special">,</span>
501 <span class="identifier">memory_order</span> <span class="identifier">order</span><span class="special">)</span></code>
506 Compare current value with <code class="computeroutput"><span class="identifier">expected</span></code>,
507 change it to <code class="computeroutput"><span class="identifier">desired</span></code>
508 if matches. Returns <code class="computeroutput"><span class="keyword">true</span></code>
509 if an exchange has been performed, and always writes the previous
510 value back in <code class="computeroutput"><span class="identifier">expected</span></code>.
517 <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">compare_exchange_strong</span><span class="special">(</span><span class="identifier">T</span>
518 <span class="special">&</span> <span class="identifier">expected</span><span class="special">,</span> <span class="identifier">T</span>
519 <span class="identifier">desired</span><span class="special">,</span>
520 <span class="identifier">memory_order</span> <span class="identifier">success_order</span><span class="special">,</span> <span class="identifier">memory_order</span>
521 <span class="identifier">failure_order</span><span class="special">))</span></code>
526 Compare current value with <code class="computeroutput"><span class="identifier">expected</span></code>,
527 change it to <code class="computeroutput"><span class="identifier">desired</span></code>
528 if matches. Returns <code class="computeroutput"><span class="keyword">true</span></code>
529 if an exchange has been performed, and always writes the previous
530 value back in <code class="computeroutput"><span class="identifier">expected</span></code>.
537 <code class="computeroutput"><span class="identifier">order</span></code> always has <code class="computeroutput"><span class="identifier">memory_order_seq_cst</span></code> as default parameter.
540 The <code class="computeroutput"><span class="identifier">compare_exchange_weak</span></code>/<code class="computeroutput"><span class="identifier">compare_exchange_strong</span></code> variants taking
541 four parameters differ from the three parameter variants in that they allow
542 a different memory ordering constraint to be specified in case the operation
546 In addition to these explicit operations, each <code class="literal">atomic<<span class="emphasis"><em>T</em></span>></code>
547 object also supports implicit <code class="literal">store</code> and <code class="literal">load</code>
548 through the use of "assignment" and "conversion to <code class="literal">T</code>"
549 operators. Avoid using these operators, as they do not allow explicit specification
550 of a memory ordering constraint.
553 <div class="section">
554 <div class="titlepage"><div><div><h4 class="title">
555 <a name="atomic.interface.interface_atomic_object.interface_atomic_integral"></a><a class="link" href="interface.html#atomic.interface.interface_atomic_object.interface_atomic_integral" title="boost::atomic<integral> template class"><code class="literal">boost::atomic<<span class="emphasis"><em>integral</em></span>></code>
557 </h4></div></div></div>
559 In addition to the operations listed in the previous section, <code class="literal">boost::atomic<<span class="emphasis"><em>I</em></span>></code>
560 for integral types <code class="literal"><span class="emphasis"><em>I</em></span></code> supports the
561 following operations:
563 <div class="informaltable"><table class="table">
584 <code class="computeroutput"><span class="identifier">T</span> <span class="identifier">fetch_add</span><span class="special">(</span><span class="identifier">T</span>
585 <span class="identifier">v</span><span class="special">,</span>
586 <span class="identifier">memory_order</span> <span class="identifier">order</span><span class="special">)</span></code>
591 Add <code class="computeroutput"><span class="identifier">v</span></code> to variable,
592 returning previous value
599 <code class="computeroutput"><span class="identifier">T</span> <span class="identifier">fetch_sub</span><span class="special">(</span><span class="identifier">T</span>
600 <span class="identifier">v</span><span class="special">,</span>
601 <span class="identifier">memory_order</span> <span class="identifier">order</span><span class="special">)</span></code>
606 Subtract <code class="computeroutput"><span class="identifier">v</span></code> from
607 variable, returning previous value
614 <code class="computeroutput"><span class="identifier">T</span> <span class="identifier">fetch_and</span><span class="special">(</span><span class="identifier">T</span>
615 <span class="identifier">v</span><span class="special">,</span>
616 <span class="identifier">memory_order</span> <span class="identifier">order</span><span class="special">)</span></code>
621 Apply bit-wise "and" with <code class="computeroutput"><span class="identifier">v</span></code>
622 to variable, returning previous value
629 <code class="computeroutput"><span class="identifier">T</span> <span class="identifier">fetch_or</span><span class="special">(</span><span class="identifier">T</span>
630 <span class="identifier">v</span><span class="special">,</span>
631 <span class="identifier">memory_order</span> <span class="identifier">order</span><span class="special">)</span></code>
636 Apply bit-wise "or" with <code class="computeroutput"><span class="identifier">v</span></code>
637 to variable, returning previous value
644 <code class="computeroutput"><span class="identifier">T</span> <span class="identifier">fetch_xor</span><span class="special">(</span><span class="identifier">T</span>
645 <span class="identifier">v</span><span class="special">,</span>
646 <span class="identifier">memory_order</span> <span class="identifier">order</span><span class="special">)</span></code>
651 Apply bit-wise "xor" with <code class="computeroutput"><span class="identifier">v</span></code>
652 to variable, returning previous value
659 <code class="computeroutput"><span class="identifier">order</span></code> always has <code class="computeroutput"><span class="identifier">memory_order_seq_cst</span></code> as default parameter.
662 In addition to these explicit operations, each <code class="literal">boost::atomic<<span class="emphasis"><em>I</em></span>></code>
663 object also supports implicit pre-/post- increment/decrement, as well as
664 the operators <code class="computeroutput"><span class="special">+=</span></code>, <code class="computeroutput"><span class="special">-=</span></code>, <code class="computeroutput"><span class="special">&=</span></code>,
665 <code class="computeroutput"><span class="special">|=</span></code> and <code class="computeroutput"><span class="special">^=</span></code>.
666 Avoid using these operators, as they do not allow explicit specification
667 of a memory ordering constraint.
670 <div class="section">
671 <div class="titlepage"><div><div><h4 class="title">
672 <a name="atomic.interface.interface_atomic_object.interface_atomic_pointer"></a><a class="link" href="interface.html#atomic.interface.interface_atomic_object.interface_atomic_pointer" title="boost::atomic<pointer> template class"><code class="literal">boost::atomic<<span class="emphasis"><em>pointer</em></span>></code>
674 </h4></div></div></div>
676 In addition to the operations applicable to all atomic object, <code class="literal">boost::atomic<<span class="emphasis"><em>P</em></span>></code>
677 for pointer types <code class="literal"><span class="emphasis"><em>P</em></span></code> (other than
678 <code class="literal">void</code> pointers) support the following operations:
680 <div class="informaltable"><table class="table">
701 <code class="computeroutput"><span class="identifier">T</span> <span class="identifier">fetch_add</span><span class="special">(</span><span class="identifier">ptrdiff_t</span>
702 <span class="identifier">v</span><span class="special">,</span>
703 <span class="identifier">memory_order</span> <span class="identifier">order</span><span class="special">)</span></code>
708 Add <code class="computeroutput"><span class="identifier">v</span></code> to variable,
709 returning previous value
716 <code class="computeroutput"><span class="identifier">T</span> <span class="identifier">fetch_sub</span><span class="special">(</span><span class="identifier">ptrdiff_t</span>
717 <span class="identifier">v</span><span class="special">,</span>
718 <span class="identifier">memory_order</span> <span class="identifier">order</span><span class="special">)</span></code>
723 Subtract <code class="computeroutput"><span class="identifier">v</span></code> from
724 variable, returning previous value
731 <code class="computeroutput"><span class="identifier">order</span></code> always has <code class="computeroutput"><span class="identifier">memory_order_seq_cst</span></code> as default parameter.
734 In addition to these explicit operations, each <code class="literal">boost::atomic<<span class="emphasis"><em>P</em></span>></code>
735 object also supports implicit pre-/post- increment/decrement, as well as
736 the operators <code class="computeroutput"><span class="special">+=</span></code>, <code class="computeroutput"><span class="special">-=</span></code>. Avoid using these operators, as they
737 do not allow explicit specification of a memory ordering constraint.
741 <div class="section">
742 <div class="titlepage"><div><div><h3 class="title">
743 <a name="atomic.interface.interface_fences"></a><a class="link" href="interface.html#atomic.interface.interface_fences" title="Fences">Fences</a>
744 </h3></div></div></div>
745 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">atomic</span><span class="special">/</span><span class="identifier">fences</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
747 <div class="informaltable"><table class="table">
768 <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">atomic_thread_fence</span><span class="special">(</span><span class="identifier">memory_order</span>
769 <span class="identifier">order</span><span class="special">)</span></code>
774 Issue fence for coordination with other threads.
781 <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">atomic_signal_fence</span><span class="special">(</span><span class="identifier">memory_order</span>
782 <span class="identifier">order</span><span class="special">)</span></code>
787 Issue fence for coordination with signal handler (only in same
795 <div class="section">
796 <div class="titlepage"><div><div><h3 class="title">
797 <a name="atomic.interface.feature_macros"></a><a class="link" href="interface.html#atomic.interface.feature_macros" title="Feature testing macros">Feature testing macros</a>
798 </h3></div></div></div>
799 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">atomic</span><span class="special">/</span><span class="identifier">capabilities</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
802 <span class="bold"><strong>Boost.Atomic</strong></span> defines a number of macros
803 to allow compile-time detection whether an atomic data type is implemented
804 using "true" atomic operations, or whether an internal "lock"
805 is used to provide atomicity. The following macros will be defined to <code class="computeroutput"><span class="number">0</span></code> if operations on the data type always require
806 a lock, to <code class="computeroutput"><span class="number">1</span></code> if operations on
807 the data type may sometimes require a lock, and to <code class="computeroutput"><span class="number">2</span></code>
808 if they are always lock-free:
810 <div class="informaltable"><table class="table">
831 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_FLAG_LOCK_FREE</span></code>
836 Indicate whether <code class="computeroutput"><span class="identifier">atomic_flag</span></code>
844 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_BOOL_LOCK_FREE</span></code>
849 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">bool</span><span class="special">></span></code> is lock-free
856 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_CHAR_LOCK_FREE</span></code>
861 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">char</span><span class="special">></span></code> (including signed/unsigned
862 variants) is lock-free
869 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_CHAR16_T_LOCK_FREE</span></code>
874 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">char16_t</span><span class="special">></span></code> (including signed/unsigned
875 variants) is lock-free
882 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_CHAR32_T_LOCK_FREE</span></code>
887 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">char32_t</span><span class="special">></span></code> (including signed/unsigned
888 variants) is lock-free
895 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_WCHAR_T_LOCK_FREE</span></code>
900 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">wchar_t</span><span class="special">></span></code> (including signed/unsigned
901 variants) is lock-free
908 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_SHORT_LOCK_FREE</span></code>
913 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">short</span><span class="special">></span></code> (including signed/unsigned
914 variants) is lock-free
921 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_INT_LOCK_FREE</span></code>
926 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span></code> (including signed/unsigned
927 variants) is lock-free
934 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_LONG_LOCK_FREE</span></code>
939 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">long</span><span class="special">></span></code> (including signed/unsigned
940 variants) is lock-free
947 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_LLONG_LOCK_FREE</span></code>
952 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">long</span>
953 <span class="keyword">long</span><span class="special">></span></code>
954 (including signed/unsigned variants) is lock-free
961 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_ADDRESS_LOCK_FREE</span></code>
962 or <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_POINTER_LOCK_FREE</span></code>
967 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="identifier">T</span>
968 <span class="special">*></span></code> is lock-free
975 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_THREAD_FENCE</span></code>
980 Indicate whether <code class="computeroutput"><span class="identifier">atomic_thread_fence</span></code>
981 function is lock-free
988 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_SIGNAL_FENCE</span></code>
993 Indicate whether <code class="computeroutput"><span class="identifier">atomic_signal_fence</span></code>
994 function is lock-free
1001 In addition to these standard macros, <span class="bold"><strong>Boost.Atomic</strong></span>
1002 also defines a number of extension macros, which can also be useful. Like
1003 the standard ones, these macros are defined to values <code class="computeroutput"><span class="number">0</span></code>,
1004 <code class="computeroutput"><span class="number">1</span></code> and <code class="computeroutput"><span class="number">2</span></code>
1005 to indicate whether the corresponding operations are lock-free or not.
1007 <div class="informaltable"><table class="table">
1028 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_INT8_LOCK_FREE</span></code>
1033 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="identifier">int8_type</span><span class="special">></span></code> is lock-free.
1040 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_INT16_LOCK_FREE</span></code>
1045 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="identifier">int16_type</span><span class="special">></span></code> is lock-free.
1052 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_INT32_LOCK_FREE</span></code>
1057 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="identifier">int32_type</span><span class="special">></span></code> is lock-free.
1064 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_INT64_LOCK_FREE</span></code>
1069 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="identifier">int64_type</span><span class="special">></span></code> is lock-free.
1076 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_INT128_LOCK_FREE</span></code>
1081 Indicate whether <code class="computeroutput"><span class="identifier">atomic</span><span class="special"><</span><span class="identifier">int128_type</span><span class="special">></span></code> is lock-free.
1088 <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_NO_ATOMIC_FLAG_INIT</span></code>
1093 Defined after including <code class="computeroutput"><span class="identifier">atomic_flag</span><span class="special">.</span><span class="identifier">hpp</span></code>,
1094 if the implementation does not support the <code class="computeroutput"><span class="identifier">BOOST_ATOMIC_FLAG_INIT</span></code>
1095 macro for static initialization of <code class="computeroutput"><span class="identifier">atomic_flag</span></code>.
1096 This macro is typically defined for pre-C++11 compilers.
1103 In the table above, <code class="computeroutput"><span class="identifier">intN_type</span></code>
1104 is a type that fits storage of contiguous <code class="computeroutput"><span class="identifier">N</span></code>
1105 bits, suitably aligned for atomic operations.
1109 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
1110 <td align="left"></td>
1111 <td align="right"><div class="copyright-footer">Copyright © 2011 Helge Bahmann<br>Copyright © 2012 Tim Blechmann<br>Copyright © 2013 Andrey Semashev<p>
1112 Distributed under the Boost Software License, Version 1.0. (See accompanying
1113 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>)
1118 <div class="spirit-nav">
1119 <a accesskey="p" href="thread_coordination.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../atomic.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="usage_examples.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>