Account for prologue spills in reg_pressure scheduling
[official-gcc.git] / libstdc++-v3 / doc / html / manual / ext_concurrency_impl.html
blob84db3da970926899feec06f88ec32d7f677f2541
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Implementation</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.78.1" /><meta name="keywords" content="ISO C++, library" /><meta name="keywords" content="ISO C++, library" /><meta name="keywords" content="ISO C++, runtime, library" /><link rel="home" href="../index.html" title="The GNU C++ Library" /><link rel="up" href="ext_concurrency.html" title="Chapter 30. Concurrency" /><link rel="prev" href="ext_concurrency.html" title="Chapter 30. Concurrency" /><link rel="next" href="ext_concurrency_use.html" title="Use" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Implementation</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ext_concurrency.html">Prev</a> </td><th width="60%" align="center">Chapter 30. Concurrency</th><td width="20%" align="right"> <a accesskey="n" href="ext_concurrency_use.html">Next</a></td></tr></table><hr /></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="manual.ext.concurrency.impl"></a>Implementation</h2></div></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="manual.ext.concurrency.impl.atomic_fallbacks"></a>Using Builtin Atomic Functions</h3></div></div></div><p>The functions for atomic operations described above are either
3 implemented via compiler intrinsics (if the underlying host is
4 capable) or by library fallbacks.</p><p>Compiler intrinsics (builtins) are always preferred. However, as
5 the compiler builtins for atomics are not universally implemented,
6 using them directly is problematic, and can result in undefined
7 function calls. (An example of an undefined symbol from the use
8 of <code class="code">__sync_fetch_and_add</code> on an unsupported host is a
9 missing reference to <code class="code">__sync_fetch_and_add_4</code>.)
10 </p><p>In addition, on some hosts the compiler intrinsics are enabled
11 conditionally, via the <code class="code">-march</code> command line flag. This makes
12 usage vary depending on the target hardware and the flags used during
13 compile.
14 </p><p>
15 <em><span class="remark">
16 Incomplete/inconsistent. This is only C++11.
17 </span></em>
18 </p><p>
19 If builtins are possible for bool-sized integral types,
20 <code class="code">ATOMIC_BOOL_LOCK_FREE</code> will be defined.
21 If builtins are possible for int-sized integral types,
22 <code class="code">ATOMIC_INT_LOCK_FREE</code> will be defined.
23 </p><p>For the following hosts, intrinsics are enabled by default.
24 </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>alpha</p></li><li class="listitem"><p>ia64</p></li><li class="listitem"><p>powerpc</p></li><li class="listitem"><p>s390</p></li></ul></div><p>For others, some form of <code class="code">-march</code> may work. On
25 non-ancient x86 hardware, <code class="code">-march=native</code> usually does the
26 trick.</p><p> For hosts without compiler intrinsics, but with capable
27 hardware, hand-crafted assembly is selected. This is the case for the following hosts:
28 </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>cris</p></li><li class="listitem"><p>hppa</p></li><li class="listitem"><p>i386</p></li><li class="listitem"><p>i486</p></li><li class="listitem"><p>m48k</p></li><li class="listitem"><p>mips</p></li><li class="listitem"><p>sparc</p></li></ul></div><p>And for the rest, a simulated atomic lock via pthreads.
29 </p><p> Detailed information about compiler intrinsics for atomic operations can be found in the GCC <a class="link" href="http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html" target="_top"> documentation</a>.
30 </p><p> More details on the library fallbacks from the porting <a class="link" href="internals.html#internals.thread_safety" title="Thread Safety">section</a>.
31 </p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="manual.ext.concurrency.impl.thread"></a>Thread Abstraction</h3></div></div></div><p>A thin layer above IEEE 1003.1 (i.e. pthreads) is used to abstract
32 the thread interface for GCC. This layer is called "gthread," and is
33 comprised of one header file that wraps the host's default thread layer with
34 a POSIX-like interface.
35 </p><p> The file &lt;gthr-default.h&gt; points to the deduced wrapper for
36 the current host. In libstdc++ implementation files,
37 &lt;bits/gthr.h&gt; is used to select the proper gthreads file.
38 </p><p>Within libstdc++ sources, all calls to underlying thread functionality
39 use this layer. More detail as to the specific interface can be found in the source <a class="link" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00883_source.html" target="_top">documentation</a>.
40 </p><p>By design, the gthread layer is interoperable with the types,
41 functions, and usage found in the usual &lt;pthread.h&gt; file,
42 including <code class="code">pthread_t</code>, <code class="code">pthread_once_t</code>, <code class="code">pthread_create</code>,
43 etc.
44 </p></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ext_concurrency.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ext_concurrency.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ext_concurrency_use.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 30. Concurrency </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Use</td></tr></table></div></body></html>