Difference between revisions of "cpp/thread"
(Undo revision 138582 by 61.2.194.101 (talk)) |
|||
Line 1: | Line 1: | ||
− | {{title| | + | {{title|Concurrency support library}} |
{{cpp/thread/navbar}} | {{cpp/thread/navbar}} | ||
− | C++ includes built-in support for threads, mutual exclusion, condition variables, and futures. | + | C++ includes built-in support for threads, atomic operations, mutual exclusion, condition variables, and futures. |
===Threads=== | ===Threads=== | ||
− | |||
Threads enable programs to execute across several processor cores. | Threads enable programs to execute across several processor cores. | ||
Line 20: | Line 19: | ||
{{dsc end}} | {{dsc end}} | ||
− | {{ | + | {{rrev|since=c++20| |
− | + | ||
===Thread cancellation=== | ===Thread cancellation=== | ||
− | |||
The {{tt|stop_XXX}} types are designed to enable thread cancellation for {{tt|std::jthread}}, although they can also be used independently of {{tt|std::jthread}} - for example to interrupt {{tt|std::condition_variable_any}} waiting functions, or for a custom thread management implementation. In fact they do not even need to be used to "stop" anything, but can instead be used for a thread-safe one-time function(s) invocation trigger, for example. | The {{tt|stop_XXX}} types are designed to enable thread cancellation for {{tt|std::jthread}}, although they can also be used independently of {{tt|std::jthread}} - for example to interrupt {{tt|std::condition_variable_any}} waiting functions, or for a custom thread management implementation. In fact they do not even need to be used to "stop" anything, but can instead be used for a thread-safe one-time function(s) invocation trigger, for example. | ||
Line 33: | Line 30: | ||
{{dsc end}} | {{dsc end}} | ||
}} | }} | ||
− | |||
===Cache size access=== | ===Cache size access=== | ||
Line 41: | Line 37: | ||
{{dsc end}} | {{dsc end}} | ||
− | === | + | ===Atomic operations=== |
+ | These components are provided for fine-grained atomic operations allowing for lockless concurrent programming. Each atomic operation is indivisible with regards to any other atomic operation that involves the same object. Atomic objects are [[cpp/language/memory_model#Threads_and_data_races|free of data races]]. | ||
+ | {{rrev|since=c++23| | ||
+ | Neither the {{tt|_Atomic}} macro, nor any of the non-macro global namespace declarations are provided by any C++ standard library header other than {{tt|<stdatomic.h>}}. | ||
+ | }} | ||
+ | |||
+ | {{dsc begin}} | ||
+ | {{dsc header | atomic }} | ||
+ | {{dsc h2 | Atomic types }} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_ref}} | ||
+ | {{dsc h2 | Operations on atomic types}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_is_lock_free}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_store}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_load}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_exchange}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_compare_exchange}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_fetch_add}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_fetch_sub}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_fetch_and}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_fetch_or}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_fetch_xor}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_wait}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_notify_one}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_notify_all}} | ||
+ | {{dsc h2 | Flag type and operations}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_flag}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_flag_test_and_set}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_flag_clear}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_flag_test}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_flag_wait}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_flag_notify_one}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_flag_notify_all}} | ||
+ | {{dsc h2 | Initialization}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_init}} | ||
+ | {{dsc inc | cpp/atomic/dsc ATOMIC_VAR_INIT}} | ||
+ | {{dsc inc | cpp/atomic/dsc ATOMIC_FLAG_INIT}} | ||
+ | {{dsc h2 | Memory synchronization ordering}} | ||
+ | {{dsc inc | cpp/atomic/dsc memory_order}} | ||
+ | {{dsc inc | cpp/atomic/dsc kill_dependency}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_thread_fence}} | ||
+ | {{dsc inc | cpp/atomic/dsc atomic_signal_fence}} | ||
+ | {{dsc h2 | C compatibility macros}} | ||
+ | {{dsc header | stdatomic.h }} | ||
+ | {{dsc inc | cpp/atomic/dsc _Atomic}} | ||
+ | {{dsc end}} | ||
+ | |||
+ | ===Mutual exclusion=== | ||
Mutual exclusion algorithms prevent multiple threads from simultaneously accessing shared resources. This prevents data races and provides support for synchronization between threads. | Mutual exclusion algorithms prevent multiple threads from simultaneously accessing shared resources. This prevents data races and provides support for synchronization between threads. | ||
Revision as of 07:33, 12 March 2022
C++ includes built-in support for threads, atomic operations, mutual exclusion, condition variables, and futures.
Contents |
Threads
Threads enable programs to execute across several processor cores.
Defined in header
<thread> | |
(C++11) |
manages a separate thread (class) |
(C++20) |
std::thread with support for auto-joining and cancellation (class) |
Functions managing the current thread | |
Defined in namespace
this_thread | |
(C++11) |
suggests that the implementation reschedule execution of threads (function) |
(C++11) |
returns the thread id of the current thread (function) |
(C++11) |
stops the execution of the current thread for a specified time duration (function) |
(C++11) |
stops the execution of the current thread until a specified time point (function) |
Thread cancellationThe
|
(since C++20) |
Cache size access
Defined in header
<new> | |
min offset to avoid false sharing max offset to promote true sharing (constant) |
Atomic operations
These components are provided for fine-grained atomic operations allowing for lockless concurrent programming. Each atomic operation is indivisible with regards to any other atomic operation that involves the same object. Atomic objects are free of data races.
Neither the |
(since C++23) |
Defined in header
<atomic> | |
Atomic types | |
(C++11) |
atomic class template and specializations for bool, integral, floating-point,(since C++20) and pointer types (class template) |
(C++20) |
provides atomic operations on non-atomic objects (class template) |
Operations on atomic types | |
(C++11) |
checks if the atomic type's operations are lock-free (function template) |
(C++11)(C++11) |
atomically replaces the value of the atomic object with a non-atomic argument (function template) |
(C++11)(C++11) |
atomically obtains the value stored in an atomic object (function template) |
(C++11)(C++11) |
atomically replaces the value of the atomic object with non-atomic argument and returns the old value of the atomic (function template) |
atomically compares the value of the atomic object with non-atomic argument and performs atomic exchange if equal or atomic load if not (function template) | |
(C++11)(C++11) |
adds a non-atomic value to an atomic object and obtains the previous value of the atomic (function template) |
(C++11)(C++11) |
subtracts a non-atomic value from an atomic object and obtains the previous value of the atomic (function template) |
(C++11)(C++11) |
replaces the atomic object with the result of bitwise AND with a non-atomic argument and obtains the previous value of the atomic (function template) |
(C++11)(C++11) |
replaces the atomic object with the result of bitwise OR with a non-atomic argument and obtains the previous value of the atomic (function template) |
(C++11)(C++11) |
replaces the atomic object with the result of bitwise XOR with a non-atomic argument and obtains the previous value of the atomic (function template) |
(C++20)(C++20) |
blocks the thread until notified and the atomic value changes (function template) |
(C++20) |
notifies a thread blocked in atomic_wait (function template) |
(C++20) |
notifies all threads blocked in atomic_wait (function template) |
Flag type and operations | |
(C++11) |
the lock-free boolean atomic type (class) |
atomically sets the flag to true and returns its previous value (function) | |
(C++11)(C++11) |
atomically sets the value of the flag to false (function) |
(C++20)(C++20) |
atomically returns the value of the flag (function) |
(C++20)(C++20) |
blocks the thread until notified and the flag changes (function) |
(C++20) |
notifies a thread blocked in atomic_flag_wait (function) |
(C++20) |
notifies all threads blocked in atomic_flag_wait (function) |
Initialization | |
(C++11)(deprecated in C++20) |
non-atomic initialization of a default-constructed atomic object (function template) |
(C++11)(deprecated in C++20) |
constant initialization of an atomic variable of static storage duration (function macro) |
(C++11) |
initializes an std::atomic_flag to false (macro constant) |
Memory synchronization ordering | |
(C++11) |
defines memory ordering constraints for the given atomic operation (enum) |
(C++11) |
removes the specified object from the std::memory_order_consume dependency tree (function template) |
(C++11) |
generic memory order-dependent fence synchronization primitive (function) |
(C++11) |
fence between a thread and a signal handler executed in the same thread (function) |
C compatibility macros | |
Defined in header
<stdatomic.h> | |
(C++23) |
compatibility macro such that _Atomic(T) is identical to std::atomic<T> (function macro) |
Mutual exclusion
Mutual exclusion algorithms prevent multiple threads from simultaneously accessing shared resources. This prevents data races and provides support for synchronization between threads.
Defined in header
<mutex> | |
(C++11) |
provides basic mutual exclusion facility (class) |
(C++11) |
provides mutual exclusion facility which implements locking with a timeout (class) |
(C++11) |
provides mutual exclusion facility which can be locked recursively by the same thread (class) |
(C++11) |
provides mutual exclusion facility which can be locked recursively by the same thread and implements locking with a timeout (class) |
Defined in header
<shared_mutex> | |
(C++17) |
provides shared mutual exclusion facility (class) |
(C++14) |
provides shared mutual exclusion facility and implements locking with a timeout (class) |
Generic mutex management | |
Defined in header
<mutex> | |
(C++11) |
implements a strictly scope-based mutex ownership wrapper (class template) |
(C++17) |
deadlock-avoiding RAII wrapper for multiple mutexes (class template) |
(C++11) |
implements movable mutex ownership wrapper (class template) |
(C++14) |
implements movable shared mutex ownership wrapper (class template) |
tags used to specify locking strategy (tag) | |
Generic locking algorithms | |
(C++11) |
attempts to obtain ownership of mutexes via repeated calls to try_lock (function template) |
(C++11) |
locks specified mutexes, blocks if any are unavailable (function template) |
Call once | |
(C++11) |
helper object to ensure that call_once invokes the function only once (class) |
(C++11) |
invokes a function only once even if called from multiple threads (function template) |
Condition variables
A condition variable is a synchronization primitive that allows multiple threads to communicate with each other. It allows some number of threads to wait (possibly with a timeout) for notification from another thread that they may proceed. A condition variable is always associated with a mutex.
Defined in header
<condition_variable> | |
(C++11) |
provides a condition variable associated with a std::unique_lock (class) |
(C++11) |
provides a condition variable associated with any lock type (class) |
(C++11) |
schedules a call to notify_all to be invoked when this thread is completely finished (function) |
(C++11) |
lists the possible results of timed waits on condition variables (enum) |
SemaphoresA semaphore is a lightweight synchronization primitive used to constrain concurrent access to a shared resource. When either would suffice, a semaphore can be more efficient than a condition variable.
Latches and BarriersLatches and barriers are thread coordination mechanisms that allow any number of threads to block until an expected number of threads arrive. A latch cannot be reused, while a barrier can be used repeatedly.
|
(since C++20) |
Futures
The standard library provides facilities to obtain values that are returned and to catch exceptions that are thrown by asynchronous tasks (i.e. functions launched in separate threads). These values are communicated in a shared state, in which the asynchronous task may write its return value or store an exception, and which may be examined, waited for, and otherwise manipulated by other threads that hold instances of std::future or std::shared_future that reference that shared state.
Defined in header
<future> | |
(C++11) |
stores a value for asynchronous retrieval (class template) |
(C++11) |
packages a function to store its return value for asynchronous retrieval (class template) |
(C++11) |
waits for a value that is set asynchronously (class template) |
(C++11) |
waits for a value (possibly referenced by other futures) that is set asynchronously (class template) |
(C++11) |
runs a function asynchronously (potentially in a new thread) and returns a std::future that will hold the result (function template) |
(C++11) |
specifies the launch policy for std::async (enum) |
(C++11) |
specifies the results of timed waits performed on std::future and std::shared_future (enum) |
Future errors | |
(C++11) |
reports an error related to futures or promises (class) |
(C++11) |
identifies the future error category (function) |
(C++11) |
identifies the future error codes (enum) |
See also
C documentation for Thread support library
|