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
|
<h1 id="firstHeading" class="firstHeading">Concurrency support library</h1> <p>C includes built-in support for threads, atomic operations, mutual exclusion, condition variables, and thread-specific storages.</p>
<p>These features are optionally provided:</p>
<ul>
<li> if the macro constant <code>__STDC_NO_THREADS__</code> is defined by the compiler, the header <code><threads.h></code> and all of the names provided in it are not provided; </li>
<li> if the macro constant <code>__STDC_NO_ATOMICS__</code> is defined by the compiler, the header <a href="thread#Atomic_operations" title="c/thread"><code><stdatomic.h></code></a> and all of the names provided in it are not provided. </li>
</ul> <p>See also <a href="language/atomic" title="c/language/atomic"><code>_Atomic</code> type specifier and qualifier</a>.</p>
<h3 id="Threads"> Threads</h3> <table class="t-dsc-begin"> <tr class="t-dsc-header"> <th colspan="2"> Defined in header <code><threads.h></code> </th>
</tr> <tr class="t-dsc"> <td> <code>thrd_t</code> </td> <td> implementation-defined complete object type identifying a thread </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/thrd_create" title="c/thread/thrd create"> <span class="t-lines"><span>thrd_create</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> creates a thread <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/thrd_equal" title="c/thread/thrd equal"> <span class="t-lines"><span>thrd_equal</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> checks if two identifiers refer to the same thread <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/thrd_current" title="c/thread/thrd current"> <span class="t-lines"><span>thrd_current</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> obtains the current thread identifier <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/thrd_sleep" title="c/thread/thrd sleep"> <span class="t-lines"><span>thrd_sleep</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> suspends execution of the calling thread for the given period of time <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/thrd_yield" title="c/thread/thrd yield"> <span class="t-lines"><span>thrd_yield</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> yields the current time slice <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/thrd_exit" title="c/thread/thrd exit"> <span class="t-lines"><span>thrd_exit</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> terminates the calling thread <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/thrd_detach" title="c/thread/thrd detach"> <span class="t-lines"><span>thrd_detach</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> detaches a thread <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/thrd_join" title="c/thread/thrd join"> <span class="t-lines"><span>thrd_join</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> blocks until a thread terminates <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/thrd_errors" title="c/thread/thrd errors"> <span class="t-lines"><span>thrd_success</span><span>thrd_timedout</span><span>thrd_busy</span><span>thrd_nomem</span><span>thrd_error</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> indicates a thread error status <br> <span class="t-mark">(constant)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><span class="t-lines"><span>thrd_start_t</span></span></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> a typedef of the function pointer type <code>int(*)(void*)</code>, used by <code><a href="http://en.cppreference.com/w/c/thread/thrd_create"><span class="kw996">thrd_create</span></a></code> <br> <span class="t-mark">(typedef)</span> </td>
</tr> </table> <h3 id="Atomic_operations"> Atomic operations</h3> <table class="t-dsc-begin"> <tr class="t-dsc-header"> <th colspan="2"> Defined in header <code><stdatomic.h></code> </th>
</tr> <tr> <td colspan="2"> <h5 id="Operations_on_atomic_types"> Operations on atomic types </h5> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_lock_free_consts" title="c/atomic/ATOMIC LOCK FREE consts"> <span class="t-lines"><span>ATOMIC_BOOL_LOCK_FREE</span><span>ATOMIC_CHAR_LOCK_FREE</span><span>ATOMIC_CHAR16_T_LOCK_FREE</span><span>ATOMIC_CHAR32_T_LOCK_FREE</span><span>ATOMIC_WCHAR_T_LOCK_FREE</span><span>ATOMIC_SHORT_LOCK_FREE</span><span>ATOMIC_INT_LOCK_FREE</span><span>ATOMIC_LONG_LOCK_FREE</span><span>ATOMIC_LLONG_LOCK_FREE</span><span>ATOMIC_POINTER_LOCK_FREE</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> indicates that the given atomic type is lock-free <br> <span class="t-mark">(macro constant)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_is_lock_free" title="c/atomic/atomic is lock free"> <span class="t-lines"><span>atomic_is_lock_free</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> indicates whether the atomic object is lock-free <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_store" title="c/atomic/atomic store"> <span class="t-lines"><span>atomic_store</span><span>atomic_store_explicit</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> stores a value in an atomic object <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_load" title="c/atomic/atomic load"> <span class="t-lines"><span>atomic_load</span><span>atomic_load_explicit</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> reads a value from an atomic object <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_exchange" title="c/atomic/atomic exchange"> <span class="t-lines"><span>atomic_exchange</span><span>atomic_exchange_explicit</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> swaps a value with the value of an atomic object <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_compare_exchange" title="c/atomic/atomic compare exchange"> <span class="t-lines"><span>atomic_compare_exchange_strong</span><span>atomic_compare_exchange_strong_explicit</span><span>atomic_compare_exchange_weak</span><span>atomic_compare_exchange_weak_explicit</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> swaps a value with an atomic object if the old value is what is expected, otherwise reads the old value <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_fetch_add" title="c/atomic/atomic fetch add"> <span class="t-lines"><span>atomic_fetch_add</span><span>atomic_fetch_add_explicit</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> atomic addition <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_fetch_sub" title="c/atomic/atomic fetch sub"> <span class="t-lines"><span>atomic_fetch_sub</span><span>atomic_fetch_sub_explicit</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> atomic subtraction <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_fetch_or" title="c/atomic/atomic fetch or"> <span class="t-lines"><span>atomic_fetch_or</span><span>atomic_fetch_or_explicit</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> atomic bitwise OR <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_fetch_xor" title="c/atomic/atomic fetch xor"> <span class="t-lines"><span>atomic_fetch_xor</span><span>atomic_fetch_xor_explicit</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> atomic bitwise exclusive OR <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_fetch_and" title="c/atomic/atomic fetch and"> <span class="t-lines"><span>atomic_fetch_and</span><span>atomic_fetch_and_explicit</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> atomic bitwise AND <br> <span class="t-mark">(function)</span> </td>
</tr> <tr> <td colspan="2"> <h5 id="Flag_type_and_operations"> Flag type and operations </h5> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_flag" title="c/atomic/atomic flag"> <span class="t-lines"><span>atomic_flag</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> lock-free atomic boolean flag <br><span class="t-mark">(struct)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_flag_test_and_set" title="c/atomic/atomic flag test and set"> <span class="t-lines"><span>atomic_flag_test_and_set</span><span>atomic_flag_test_and_set_explicit</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> sets an atomic_flag to true and returns the old value <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_flag_clear" title="c/atomic/atomic flag clear"> <span class="t-lines"><span>atomic_flag_clear</span><span>atomic_flag_clear_explicit</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> sets an atomic_flag to false <br> <span class="t-mark">(function)</span> </td>
</tr> <tr> <td colspan="2"> <h5 id="Initialization"> Initialization </h5> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_init" title="c/atomic/atomic init"> <span class="t-lines"><span>atomic_init</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> initializes an existing atomic object <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_var_init" title="c/atomic/ATOMIC VAR INIT"> <span class="t-lines"><span>ATOMIC_VAR_INIT</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span><span class="t-mark-rev t-deprecated-c17">(deprecated in C17)</span><span class="t-mark-rev t-until-c23">(removed in C23)</span></span></span></div> </td> <td> initializes a new atomic object <br> <span class="t-mark">(function macro)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_flag_init" title="c/atomic/ATOMIC FLAG INIT"> <span class="t-lines"><span>ATOMIC_FLAG_INIT</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> initializes a new <code><a href="http://en.cppreference.com/w/c/atomic/atomic_flag"><span class="kw917">atomic_flag</span></a></code> <br> <span class="t-mark">(macro constant)</span> </td>
</tr> <tr> <td colspan="2"> <h5 id="Memory_synchronization_ordering"> Memory synchronization ordering </h5> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/memory_order" title="c/atomic/memory order"> <span class="t-lines"><span>memory_order</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> defines memory ordering constraints <br> <span class="t-mark">(enum)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/kill_dependency" title="c/atomic/kill dependency"> <span class="t-lines"><span>kill_dependency</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> breaks a dependency chain for <code><a href="http://en.cppreference.com/w/c/atomic/memory_order"><span class="kw912">memory_order_consume</span></a></code> <br> <span class="t-mark">(function macro)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_thread_fence" title="c/atomic/atomic thread fence"> <span class="t-lines"><span>atomic_thread_fence</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> generic memory order-dependent fence synchronization primitive <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="atomic/atomic_signal_fence" title="c/atomic/atomic signal fence"> <span class="t-lines"><span>atomic_signal_fence</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> fence between a thread and a signal handler executed in the same thread <br> <span class="t-mark">(function)</span> </td>
</tr> <tr> <td colspan="2"> <h5 id="Convenience_type_aliases"> Convenience type aliases </h5> </td>
</tr> <tr class="t-dsc-hitem"> <th> Typedef name </th> <th> Full type name </th>
</tr> <tr class="t-dsc"> <td> <code>atomic_bool</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic _Bool</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_char</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic char</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_schar</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic signed char</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_uchar</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic unsigned char</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_short</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic short</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_ushort</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic unsigned short</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_int</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic int</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_uint</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic unsigned int</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_long</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic long</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_ulong</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic unsigned long</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_llong</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic long long</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_ullong</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic unsigned long long</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_char8_t</code><span class="t-mark-rev t-since-c23">(C23)</span> </td> <td> <code>_Atomic char8_t</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_char16_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic char16_t</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_char32_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic char32_t</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_wchar_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic wchar_t</code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_int_least8_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw114">int_least8_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_uint_least8_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw128">uint_least8_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_int_least16_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw115">int_least16_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_uint_least16_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw129">uint_least16_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_int_least32_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw116">int_least32_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_uint_least32_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw130">uint_least32_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_int_least64_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw117">int_least64_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_uint_least64_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw131">uint_least64_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_int_fast8_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw110">int_fast8_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_uint_fast8_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw124">uint_fast8_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_int_fast16_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw111">int_fast16_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_uint_fast16_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw125">uint_fast16_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_int_fast32_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw112">int_fast32_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_uint_fast32_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw126">uint_fast32_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_int_fast64_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw113">int_fast64_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_uint_fast64_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw127">uint_fast64_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_intptr_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw119">intptr_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_uintptr_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw133">uintptr_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_size_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/size_t"><span class="kw100">size_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_ptrdiff_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/ptrdiff_t"><span class="kw101">ptrdiff_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_intmax_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw118">intmax_t</span></a></code> </td>
</tr> <tr class="t-dsc"> <td> <code>atomic_uintmax_t</code><span class="t-mark-rev t-since-c11">(C11)</span> </td> <td> <code>_Atomic <a href="http://en.cppreference.com/w/c/types/integer"><span class="kw132">uintmax_t</span></a></code> </td>
</tr> </table> <h3 id="Mutual_exclusion"> Mutual exclusion</h3> <table class="t-dsc-begin"> <tr class="t-dsc-header"> <th colspan="2"> Defined in header <code><threads.h></code> </th>
</tr> <tr class="t-dsc"> <td> <code>mtx_t</code> </td> <td> mutex identifier </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/mtx_init" title="c/thread/mtx init"> <span class="t-lines"><span>mtx_init</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> creates a mutex <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/mtx_lock" title="c/thread/mtx lock"> <span class="t-lines"><span>mtx_lock</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> blocks until locks a mutex <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/mtx_timedlock" title="c/thread/mtx timedlock"> <span class="t-lines"><span>mtx_timedlock</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> blocks until locks a mutex or times out <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/mtx_trylock" title="c/thread/mtx trylock"> <span class="t-lines"><span>mtx_trylock</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> locks a mutex or returns without blocking if already locked <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/mtx_unlock" title="c/thread/mtx unlock"> <span class="t-lines"><span>mtx_unlock</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> unlocks a mutex <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/mtx_destroy" title="c/thread/mtx destroy"> <span class="t-lines"><span>mtx_destroy</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> destroys a mutex <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/mtx_types" title="c/thread/mtx types"> <span class="t-lines"><span>mtx_plain</span><span>mtx_recursive</span><span>mtx_timed</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span><span><span class="t-mark-rev t-since-c11">(C11)</span></span><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> defines the type of a mutex <br> <span class="t-mark">(enum)</span> </td>
</tr> <tr> <td colspan="2"> <h5 id="Call_once"> Call once </h5> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/call_once" title="c/thread/call once"> <span class="t-lines"><span>call_once</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> calls a function exactly once <br> <span class="t-mark">(function)</span> </td>
</tr> </table> <h3 id="Condition_variables"> Condition variables</h3> <table class="t-dsc-begin"> <tr class="t-dsc-header"> <th colspan="2"> Defined in header <code><threads.h></code> </th>
</tr> <tr class="t-dsc"> <td> <code>cnd_t</code> </td> <td> condition variable identifier </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/cnd_init" title="c/thread/cnd init"> <span class="t-lines"><span>cnd_init</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> creates a condition variable <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/cnd_signal" title="c/thread/cnd signal"> <span class="t-lines"><span>cnd_signal</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> unblocks one thread blocked on a condition variable <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/cnd_broadcast" title="c/thread/cnd broadcast"> <span class="t-lines"><span>cnd_broadcast</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> unblocks all threads blocked on a condition variable <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/cnd_wait" title="c/thread/cnd wait"> <span class="t-lines"><span>cnd_wait</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> blocks on a condition variable <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/cnd_timedwait" title="c/thread/cnd timedwait"> <span class="t-lines"><span>cnd_timedwait</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> blocks on a condition variable, with a timeout <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/cnd_destroy" title="c/thread/cnd destroy"> <span class="t-lines"><span>cnd_destroy</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> destroys a condition variable <br> <span class="t-mark">(function)</span> </td>
</tr> </table> <h3 id="Thread-local_storage"> Thread-local storage</h3> <table class="t-dsc-begin"> <tr class="t-dsc-header"> <th colspan="2"> Defined in header <code><threads.h></code> </th>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/thread_local" title="c/thread/thread local"> <span class="t-lines"><span>thread_local</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span><span class="t-mark-rev t-until-c23">(removed in C23)</span></span></span></div> </td> <td> convenience macro for storage-class specifier <code>_Thread_local</code> <br> <span class="t-mark">(keyword macro)</span> </td>
</tr> <tr class="t-dsc"> <td> <code>tss_t</code> </td> <td> thread-specific storage pointer </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/tss_dtor_iterations" title="c/thread/TSS DTOR ITERATIONS"> <span class="t-lines"><span>TSS_DTOR_ITERATIONS</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> maximum number of times destructors are called <br> <span class="t-mark">(macro constant)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><span class="t-lines"><span><code>tss_dtor_t</code></span></span></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> function pointer type <code>void(*)(void*)</code>, used for TSS destructor <br> <span class="t-mark">(typedef)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/tss_create" title="c/thread/tss create"> <span class="t-lines"><span>tss_create</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> creates thread-specific storage pointer with a given destructor <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/tss_get" title="c/thread/tss get"> <span class="t-lines"><span>tss_get</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> reads from thread-specific storage <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/tss_set" title="c/thread/tss set"> <span class="t-lines"><span>tss_set</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> write to thread-specific storage <br> <span class="t-mark">(function)</span> </td>
</tr> <tr class="t-dsc"> <td> <div><a href="thread/tss_delete" title="c/thread/tss delete"> <span class="t-lines"><span>tss_delete</span></span></a></div>
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> releases the resources held by a given thread-specific pointer <br> <span class="t-mark">(function)</span> </td>
</tr> </table> <h3 id="Reserved_identifiers"> Reserved identifiers</h3> <p>In future revisions of the C standard:</p>
<ul>
<li> function names, type names, and enumeration constants that begin with either <code>cnd_</code>, <code>mtx_</code>, <code>thrd_</code>, or <code>tss_</code>, and a lowercase letter may be added to the declarations in the <code><threads.h></code> header; </li>
<li> macros that begin with <code>ATOMIC_</code> and an uppercase letter may be added to the macros defined in the <a href="thread#Atomic_operations" title="c/thread"><code><stdatomic.h></code></a> header; </li>
<li> typedef names that begin with either <code>atomic_</code> or <code>memory_</code>, and a lowercase letter may be added to the declarations in the <a href="thread#Atomic_operations" title="c/thread"><code><stdatomic.h></code></a> header; </li>
<li> enumeration constants that begin with <code>memory_order_</code> and a lowercase letter may be added to the definition of the <code><a href="atomic/memory_order" title="c/atomic/memory order">memory_order</a></code> type in the <a href="thread#Atomic_operations" title="c/thread"><code><stdatomic.h></code></a> header; </li>
<li> function names that begin with <code>atomic_</code> and a lowercase letter may be added to the declarations in the <a href="thread#Atomic_operations" title="c/thread"><code><stdatomic.h></code></a> header. </li>
</ul> <p>Identifiers reserved for functions names are always <span class="t-rev-inl t-since-c23"><span>potentially</span><span><span class="t-mark-rev t-since-c23">(since C23)</span></span></span> reserved for use as identifiers with external linkage, while other identifiers list here are <span class="t-rev-inl t-since-c23"><span>potentially</span><span><span class="t-mark-rev t-since-c23">(since C23)</span></span></span> reserved when <a href="thread#Atomic_operations" title="c/thread"><code><stdatomic.h></code></a> is included.</p>
<p>Declaring, defining, or <code>#undef</code>ing such an identifier results in undefined behavior<span class="t-rev-inl t-since-c23"><span> if it is provided by the standard or implementation</span><span><span class="t-mark-rev t-since-c23">(since C23)</span></span></span>. Portable programs should not use those identifiers.</p>
<h3 id="References"> References</h3> <ul>
<li> C23 standard (ISO/IEC 9899:2023): </li>
<ul>
<li> 7.17 Atomics <stdatomic.h> (p: TBD) </li>
<li> 7.26 Threads <threads.h> (p: TBD) </li>
<li> 7.31.8 Atomics <stdatomic.h> (p: TBD) </li>
<li> 7.31.15 Threads <threads.h> (p: TBD) </li>
</ul>
<li> C17 standard (ISO/IEC 9899:2018): </li>
<ul>
<li> 7.17 Atomics <stdatomic.h> (p: 200-209) </li>
<li> 7.26 Threads <threads.h> (p: 274-283) </li>
<li> 7.31.8 Atomics <stdatomic.h> (p: 332) </li>
<li> 7.31.15 Threads <threads.h> (p: 333) </li>
</ul>
<li> C11 standard (ISO/IEC 9899:2011): </li>
<ul>
<li> 7.17 Atomics <stdatomic.h> (p: 273-286) </li>
<li> 7.26 Threads <threads.h> (p: 376-387) </li>
<li> 7.31.8 Atomics <stdatomic.h> (p: 455-456) </li>
<li> 7.31.15 Threads <threads.h> (p: 456) </li>
</ul>
</ul> <h3 id="See_also"> See also</h3> <table class="t-dsc-begin"> <tr class="t-dsc"> <td colspan="2"> <span><a href="https://en.cppreference.com/w/cpp/thread" title="cpp/thread">C++ documentation</a></span> for <span class=""><span>Concurrency support library</span></span> </td>
</tr> </table> <h3 id="External_links"> External links</h3> <table> <tr> <td>
<a rel="nofollow" class="external text" href="https://www.gnu.org/software/libc/manual/html_node/ISO-C-Mutexes.html">GNU GCC Libc Manual: ISO C Mutexes</a> </td>
</tr>
</table> <div class="_attribution">
<p class="_attribution-p">
© cppreference.com<br>Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.<br>
<a href="https://en.cppreference.com/w/c/thread" class="_attribution-link">https://en.cppreference.com/w/c/thread</a>
</p>
</div>
|