hc
2023-05-26 a23f51ed7a39e452c1037343a84d7db1ca2c5bd7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2016 Free Software Foundation, Inc.
 
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below).  A copy of the license is included in the section entitled
"GNU Free Documentation License".
 
(a) The FSF's Front-Cover Text is:
 
A GNU Manual
 
(b) The FSF's Back-Cover Text is:
 
You have freedom to copy and modify this GNU Manual, like GNU
     software.  Copies published by the Free Software Foundation raise
     funds for GNU development. -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Using the GNU Compiler Collection (GCC): __atomic Builtins</title>
 
<meta name="description" content="Using the GNU Compiler Collection (GCC): __atomic Builtins">
<meta name="keywords" content="Using the GNU Compiler Collection (GCC): __atomic Builtins">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="C-Extensions.html#C-Extensions" rel="up" title="C Extensions">
<link href="Integer-Overflow-Builtins.html#Integer-Overflow-Builtins" rel="next" title="Integer Overflow Builtins">
<link href="_005f_005fsync-Builtins.html#g_t_005f_005fsync-Builtins" rel="prev" title="__sync Builtins">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
 
 
</head>
 
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="g_t_005f_005fatomic-Builtins"></a>
<div class="header">
<p>
Next: <a href="Integer-Overflow-Builtins.html#Integer-Overflow-Builtins" accesskey="n" rel="next">Integer Overflow Builtins</a>, Previous: <a href="_005f_005fsync-Builtins.html#g_t_005f_005fsync-Builtins" accesskey="p" rel="prev">__sync Builtins</a>, Up: <a href="C-Extensions.html#C-Extensions" accesskey="u" rel="up">C Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Built_002din-Functions-for-Memory-Model-Aware-Atomic-Operations"></a>
<h3 class="section">6.52 Built-in Functions for Memory Model Aware Atomic Operations</h3>
 
<p>The following built-in functions approximately match the requirements
for the C++11 memory model.  They are all
identified by being prefixed with &lsquo;<samp>__atomic</samp>&rsquo; and most are
overloaded so that they work with multiple types.
</p>
<p>These functions are intended to replace the legacy &lsquo;<samp>__sync</samp>&rsquo;
builtins.  The main difference is that the memory order that is requested
is a parameter to the functions.  New code should always use the
&lsquo;<samp>__atomic</samp>&rsquo; builtins rather than the &lsquo;<samp>__sync</samp>&rsquo; builtins.
</p>
<p>Note that the &lsquo;<samp>__atomic</samp>&rsquo; builtins assume that programs will
conform to the C++11 memory model.  In particular, they assume
that programs are free of data races.  See the C++11 standard for
detailed requirements.
</p>
<p>The &lsquo;<samp>__atomic</samp>&rsquo; builtins can be used with any integral scalar or
pointer type that is 1, 2, 4, or 8 bytes in length.  16-byte integral
types are also allowed if &lsquo;<samp>__int128</samp>&rsquo; (see <a href="_005f_005fint128.html#g_t_005f_005fint128">__int128</a>) is
supported by the architecture.
</p>
<p>The four non-arithmetic functions (load, store, exchange, and 
compare_exchange) all have a generic version as well.  This generic
version works on any data type.  It uses the lock-free built-in function
if the specific data type size makes that possible; otherwise, an
external call is left to be resolved at run time.  This external call is
the same format with the addition of a &lsquo;<samp>size_t</samp>&rsquo; parameter inserted
as the first parameter indicating the size of the object being pointed to.
All objects must be the same size.
</p>
<p>There are 6 different memory orders that can be specified.  These map
to the C++11 memory orders with the same names, see the C++11 standard
or the <a href="http://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync">GCC wiki
on atomic synchronization</a> for detailed definitions.  Individual
targets may also support additional memory orders for use on specific
architectures.  Refer to the target documentation for details of
these.
</p>
<p>An atomic operation can both constrain code motion and
be mapped to hardware instructions for synchronization between threads
(e.g., a fence).  To which extent this happens is controlled by the
memory orders, which are listed here in approximately ascending order of
strength.  The description of each memory order is only meant to roughly
illustrate the effects and is not a specification; see the C++11
memory model for precise semantics.
</p>
<dl compact="compact">
<dt><code>__ATOMIC_RELAXED</code></dt>
<dd><p>Implies no inter-thread ordering constraints.
</p></dd>
<dt><code>__ATOMIC_CONSUME</code></dt>
<dd><p>This is currently implemented using the stronger <code>__ATOMIC_ACQUIRE</code>
memory order because of a deficiency in C++11&rsquo;s semantics for
<code>memory_order_consume</code>.
</p></dd>
<dt><code>__ATOMIC_ACQUIRE</code></dt>
<dd><p>Creates an inter-thread happens-before constraint from the release (or
stronger) semantic store to this acquire load.  Can prevent hoisting
of code to before the operation.
</p></dd>
<dt><code>__ATOMIC_RELEASE</code></dt>
<dd><p>Creates an inter-thread happens-before constraint to acquire (or stronger)
semantic loads that read from this release store.  Can prevent sinking
of code to after the operation.
</p></dd>
<dt><code>__ATOMIC_ACQ_REL</code></dt>
<dd><p>Combines the effects of both <code>__ATOMIC_ACQUIRE</code> and
<code>__ATOMIC_RELEASE</code>.
</p></dd>
<dt><code>__ATOMIC_SEQ_CST</code></dt>
<dd><p>Enforces total ordering with all other <code>__ATOMIC_SEQ_CST</code> operations.
</p></dd>
</dl>
 
<p>Note that in the C++11 memory model, <em>fences</em> (e.g.,
&lsquo;<samp>__atomic_thread_fence</samp>&rsquo;) take effect in combination with other
atomic operations on specific memory locations (e.g., atomic loads);
operations on specific memory locations do not necessarily affect other
operations in the same way.
</p>
<p>Target architectures are encouraged to provide their own patterns for
each of the atomic built-in functions.  If no target is provided, the original
non-memory model set of &lsquo;<samp>__sync</samp>&rsquo; atomic built-in functions are
used, along with any required synchronization fences surrounding it in
order to achieve the proper behavior.  Execution in this case is subject
to the same restrictions as those built-in functions.
</p>
<p>If there is no pattern or mechanism to provide a lock-free instruction
sequence, a call is made to an external routine with the same parameters
to be resolved at run time.
</p>
<p>When implementing patterns for these built-in functions, the memory order
parameter can be ignored as long as the pattern implements the most
restrictive <code>__ATOMIC_SEQ_CST</code> memory order.  Any of the other memory
orders execute correctly with this memory order but they may not execute as
efficiently as they could with a more appropriate implementation of the
relaxed requirements.
</p>
<p>Note that the C++11 standard allows for the memory order parameter to be
determined at run time rather than at compile time.  These built-in
functions map any run-time value to <code>__ATOMIC_SEQ_CST</code> rather
than invoke a runtime library call or inline a switch statement.  This is
standard compliant, safe, and the simplest approach for now.
</p>
<p>The memory order parameter is a signed int, but only the lower 16 bits are
reserved for the memory order.  The remainder of the signed int is reserved
for target use and should be 0.  Use of the predefined atomic values
ensures proper usage.
</p>
<dl>
<dt><a name="index-_005f_005fatomic_005fload_005fn"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_load_n</strong> <em>(<var>type</var> *ptr, int memorder)</em></dt>
<dd><p>This built-in function implements an atomic load operation.  It returns the
contents of <code>*<var>ptr</var></code>.
</p>
<p>The valid memory order variants are
<code>__ATOMIC_RELAXED</code>, <code>__ATOMIC_SEQ_CST</code>, <code>__ATOMIC_ACQUIRE</code>,
and <code>__ATOMIC_CONSUME</code>.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005fload"></a>Built-in Function: <em>void</em> <strong>__atomic_load</strong> <em>(<var>type</var> *ptr, <var>type</var> *ret, int memorder)</em></dt>
<dd><p>This is the generic version of an atomic load.  It returns the
contents of <code>*<var>ptr</var></code> in <code>*<var>ret</var></code>.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005fstore_005fn"></a>Built-in Function: <em>void</em> <strong>__atomic_store_n</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dd><p>This built-in function implements an atomic store operation.  It writes 
<code><var>val</var></code> into <code>*<var>ptr</var></code>.  
</p>
<p>The valid memory order variants are
<code>__ATOMIC_RELAXED</code>, <code>__ATOMIC_SEQ_CST</code>, and <code>__ATOMIC_RELEASE</code>.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005fstore"></a>Built-in Function: <em>void</em> <strong>__atomic_store</strong> <em>(<var>type</var> *ptr, <var>type</var> *val, int memorder)</em></dt>
<dd><p>This is the generic version of an atomic store.  It stores the value
of <code>*<var>val</var></code> into <code>*<var>ptr</var></code>.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005fexchange_005fn"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_exchange_n</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dd><p>This built-in function implements an atomic exchange operation.  It writes
<var>val</var> into <code>*<var>ptr</var></code>, and returns the previous contents of
<code>*<var>ptr</var></code>.
</p>
<p>The valid memory order variants are
<code>__ATOMIC_RELAXED</code>, <code>__ATOMIC_SEQ_CST</code>, <code>__ATOMIC_ACQUIRE</code>,
<code>__ATOMIC_RELEASE</code>, and <code>__ATOMIC_ACQ_REL</code>.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005fexchange"></a>Built-in Function: <em>void</em> <strong>__atomic_exchange</strong> <em>(<var>type</var> *ptr, <var>type</var> *val, <var>type</var> *ret, int memorder)</em></dt>
<dd><p>This is the generic version of an atomic exchange.  It stores the
contents of <code>*<var>val</var></code> into <code>*<var>ptr</var></code>. The original value
of <code>*<var>ptr</var></code> is copied into <code>*<var>ret</var></code>.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005fcompare_005fexchange_005fn"></a>Built-in Function: <em>bool</em> <strong>__atomic_compare_exchange_n</strong> <em>(<var>type</var> *ptr, <var>type</var> *expected, <var>type</var> desired, bool weak, int success_memorder, int failure_memorder)</em></dt>
<dd><p>This built-in function implements an atomic compare and exchange operation.
This compares the contents of <code>*<var>ptr</var></code> with the contents of
<code>*<var>expected</var></code>. If equal, the operation is a <em>read-modify-write</em>
operation that writes <var>desired</var> into <code>*<var>ptr</var></code>.  If they are not
equal, the operation is a <em>read</em> and the current contents of
<code>*<var>ptr</var></code> are written into <code>*<var>expected</var></code>.  <var>weak</var> is true
for weak compare_exchange, which may fail spuriously, and false for
the strong variation, which never fails spuriously.  Many targets
only offer the strong variation and ignore the parameter.  When in doubt, use
the strong variation.
</p>
<p>If <var>desired</var> is written into <code>*<var>ptr</var></code> then true is returned
and memory is affected according to the
memory order specified by <var>success_memorder</var>.  There are no
restrictions on what memory order can be used here.
</p>
<p>Otherwise, false is returned and memory is affected according
to <var>failure_memorder</var>. This memory order cannot be
<code>__ATOMIC_RELEASE</code> nor <code>__ATOMIC_ACQ_REL</code>.  It also cannot be a
stronger order than that specified by <var>success_memorder</var>.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005fcompare_005fexchange"></a>Built-in Function: <em>bool</em> <strong>__atomic_compare_exchange</strong> <em>(<var>type</var> *ptr, <var>type</var> *expected, <var>type</var> *desired, bool weak, int success_memorder, int failure_memorder)</em></dt>
<dd><p>This built-in function implements the generic version of
<code>__atomic_compare_exchange</code>.  The function is virtually identical to
<code>__atomic_compare_exchange_n</code>, except the desired value is also a
pointer.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005fadd_005ffetch"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_add_fetch</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dt><a name="index-_005f_005fatomic_005fsub_005ffetch"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_sub_fetch</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dt><a name="index-_005f_005fatomic_005fand_005ffetch"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_and_fetch</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dt><a name="index-_005f_005fatomic_005fxor_005ffetch"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_xor_fetch</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dt><a name="index-_005f_005fatomic_005for_005ffetch"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_or_fetch</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dt><a name="index-_005f_005fatomic_005fnand_005ffetch"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_nand_fetch</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dd><p>These built-in functions perform the operation suggested by the name, and
return the result of the operation.  Operations on pointer arguments are
performed as if the operands were of the <code>uintptr_t</code> type.  That is,
they are not scaled by the size of the type to which the pointer points.
</p>
<div class="smallexample">
<pre class="smallexample">{ *ptr <var>op</var>= val; return *ptr; }
</pre></div>
 
<p>The object pointed to by the first argument must be of integer or pointer
type.  It must not be a Boolean type.  All memory orders are valid.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005ffetch_005fadd"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_fetch_add</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dt><a name="index-_005f_005fatomic_005ffetch_005fsub"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_fetch_sub</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dt><a name="index-_005f_005fatomic_005ffetch_005fand"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_fetch_and</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dt><a name="index-_005f_005fatomic_005ffetch_005fxor"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_fetch_xor</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dt><a name="index-_005f_005fatomic_005ffetch_005for"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_fetch_or</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dt><a name="index-_005f_005fatomic_005ffetch_005fnand"></a>Built-in Function: <em><var>type</var></em> <strong>__atomic_fetch_nand</strong> <em>(<var>type</var> *ptr, <var>type</var> val, int memorder)</em></dt>
<dd><p>These built-in functions perform the operation suggested by the name, and
return the value that had previously been in <code>*<var>ptr</var></code>.  Operations
on pointer arguments are performed as if the operands were of
the <code>uintptr_t</code> type.  That is, they are not scaled by the size of
the type to which the pointer points.
</p>
<div class="smallexample">
<pre class="smallexample">{ tmp = *ptr; *ptr <var>op</var>= val; return tmp; }
</pre></div>
 
<p>The same constraints on arguments apply as for the corresponding
<code>__atomic_op_fetch</code> built-in functions.  All memory orders are valid.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005ftest_005fand_005fset"></a>Built-in Function: <em>bool</em> <strong>__atomic_test_and_set</strong> <em>(void *ptr, int memorder)</em></dt>
<dd>
<p>This built-in function performs an atomic test-and-set operation on
the byte at <code>*<var>ptr</var></code>.  The byte is set to some implementation
defined nonzero &ldquo;set&rdquo; value and the return value is <code>true</code> if and only
if the previous contents were &ldquo;set&rdquo;.
It should be only used for operands of type <code>bool</code> or <code>char</code>. For 
other types only part of the value may be set.
</p>
<p>All memory orders are valid.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005fclear"></a>Built-in Function: <em>void</em> <strong>__atomic_clear</strong> <em>(bool *ptr, int memorder)</em></dt>
<dd>
<p>This built-in function performs an atomic clear operation on
<code>*<var>ptr</var></code>.  After the operation, <code>*<var>ptr</var></code> contains 0.
It should be only used for operands of type <code>bool</code> or <code>char</code> and 
in conjunction with <code>__atomic_test_and_set</code>.
For other types it may only clear partially. If the type is not <code>bool</code>
prefer using <code>__atomic_store</code>.
</p>
<p>The valid memory order variants are
<code>__ATOMIC_RELAXED</code>, <code>__ATOMIC_SEQ_CST</code>, and
<code>__ATOMIC_RELEASE</code>.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005fthread_005ffence"></a>Built-in Function: <em>void</em> <strong>__atomic_thread_fence</strong> <em>(int memorder)</em></dt>
<dd>
<p>This built-in function acts as a synchronization fence between threads
based on the specified memory order.
</p>
<p>All memory orders are valid.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005fsignal_005ffence"></a>Built-in Function: <em>void</em> <strong>__atomic_signal_fence</strong> <em>(int memorder)</em></dt>
<dd>
<p>This built-in function acts as a synchronization fence between a thread
and signal handlers based in the same thread.
</p>
<p>All memory orders are valid.
</p>
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005falways_005flock_005ffree"></a>Built-in Function: <em>bool</em> <strong>__atomic_always_lock_free</strong> <em>(size_t size,  void *ptr)</em></dt>
<dd>
<p>This built-in function returns true if objects of <var>size</var> bytes always
generate lock-free atomic instructions for the target architecture.
<var>size</var> must resolve to a compile-time constant and the result also
resolves to a compile-time constant.
</p>
<p><var>ptr</var> is an optional pointer to the object that may be used to determine
alignment.  A value of 0 indicates typical alignment should be used.  The 
compiler may also ignore this parameter.
</p>
<div class="smallexample">
<pre class="smallexample">if (__atomic_always_lock_free (sizeof (long long), 0))
</pre></div>
 
</dd></dl>
 
<dl>
<dt><a name="index-_005f_005fatomic_005fis_005flock_005ffree"></a>Built-in Function: <em>bool</em> <strong>__atomic_is_lock_free</strong> <em>(size_t size, void *ptr)</em></dt>
<dd>
<p>This built-in function returns true if objects of <var>size</var> bytes always
generate lock-free atomic instructions for the target architecture.  If
the built-in function is not known to be lock-free, a call is made to a
runtime routine named <code>__atomic_is_lock_free</code>.
</p>
<p><var>ptr</var> is an optional pointer to the object that may be used to determine
alignment.  A value of 0 indicates typical alignment should be used.  The 
compiler may also ignore this parameter.
</p></dd></dl>
 
<hr>
<div class="header">
<p>
Next: <a href="Integer-Overflow-Builtins.html#Integer-Overflow-Builtins" accesskey="n" rel="next">Integer Overflow Builtins</a>, Previous: <a href="_005f_005fsync-Builtins.html#g_t_005f_005fsync-Builtins" accesskey="p" rel="prev">__sync Builtins</a>, Up: <a href="C-Extensions.html#C-Extensions" accesskey="u" rel="up">C Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
 
 
 
</body>
</html>