diff options
Diffstat (limited to 'devdocs/c/thread.html')
| -rw-r--r-- | devdocs/c/thread.html | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/devdocs/c/thread.html b/devdocs/c/thread.html new file mode 100644 index 00000000..0eca97fb --- /dev/null +++ b/devdocs/c/thread.html @@ -0,0 +1,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> |
