synchronization¶
The contents of this module can be included with the header
hpx/modules/synchronization.hpp
. These headers may be used by user-code but are not
guaranteed stable (neither header location nor contents). You are using these at
your own risk. If you wish to use non-public functionality from a module we
strongly suggest only including the module header hpx/modules/synchronization.hpp
, not
the particular header in which the functionality you would like to use is
defined. See Public API for a list of names that are part of the public
HPX API.
Header hpx/condition_variable.hpp
¶
Header hpx/local/barrier.hpp
¶
-
namespace
hpx
Header hpx/mutex.hpp
¶
Header hpx/semaphore.hpp
¶
-
namespace
hpx
Header hpx/stop_token.hpp
¶
Header hpx/synchronization/barrier.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
-
class
barrier
¶ - #include <barrier.hpp>
A barrier can be used to synchronize a specific number of threads, blocking all of the entering threads until all of the threads have entered the barrier.
- Note
A barrier is not a LCO in the sense that it has no global id and it can’t be triggered using the action (parcel) mechanism. It is just a low level synchronization primitive allowing to synchronize a given number of threads.
Public Functions
-
~barrier
()¶
-
void
wait
()¶ The function wait will block the number of entering threads (as given by the constructor parameter number_of_threads), releasing all waiting threads as soon as the last thread entered this function.
-
void
count_up
()¶ The function count_up will increase the number of threads to be waited in wait function.
-
void
reset
(std::size_t number_of_threads)¶ The function reset will reset the number of threads as given by the function parameter number_of_threads. the newer coming threads executing the function wait will be waiting until total_ is equal to barrier_flag. The last thread exiting the wait function will notify the newer threads waiting and the newer threads will get the reset number_of_threads_. The function reset can be executed while previous threads executing waiting after they have been waken up. Thus total_ can not be reset to barrier_flag which will break the comparison condition under the function wait.
Private Members
-
mutex_type
mtx_
¶
-
template<typename
OnCompletion
= detail::empty_oncompletion>
classcpp20_barrier
¶ - #include <barrier.hpp>
Public Types
-
template<>
usingarrival_token
= bool¶
Public Functions
-
HPX_NON_COPYABLE
(cpp20_barrier)¶
-
HPX_NODISCARD arrival_token hpx::lcos::local::cpp20_barrier::arrive(std::ptrdiff_t update = 1)
-
void
wait
(arrival_token &&old_phase) const¶
-
void
arrive_and_wait
()¶ Effects: Equivalent to: wait(arrive()).
-
void
arrive_and_drop
()¶
Public Static Functions
-
static constexpr std::ptrdiff_t() hpx::lcos::local::cpp20_barrier::max()
-
template<>
-
class
-
namespace
-
namespace
Header hpx/synchronization/channel_mpmc.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
-
-
template<typename
T
, typenameMutex
= util::spinlock>
classbounded_channel
¶ - #include <channel_mpmc.hpp>
Public Functions
-
bounded_channel
(bounded_channel &&rhs)¶
-
bounded_channel &
operator=
(bounded_channel &&rhs)¶
-
~bounded_channel
()¶
-
bool
get
(T *val = nullptr) const¶
-
bool
set
(T &&t)¶
Private Types
-
template<>
usingmutex_type
= Mutex¶
-
-
template<typename
-
namespace
-
namespace
Header hpx/synchronization/channel_mpsc.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
-
-
template<typename
T
, typenameMutex
= util::spinlock>
classbase_channel_mpsc
¶ - #include <channel_mpsc.hpp>
Public Functions
-
base_channel_mpsc
(base_channel_mpsc &&rhs)¶
-
base_channel_mpsc &
operator=
(base_channel_mpsc &&rhs)¶
-
~base_channel_mpsc
()¶
-
bool
get
(T *val = nullptr) const¶
-
bool
set
(T &&t)¶
Private Types
-
template<>
usingmutex_type
= Mutex¶
Private Members
-
struct
tail_data
¶
-
-
template<typename
-
namespace
-
namespace
Header hpx/synchronization/channel_spsc.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
-
template<typename
T
>
classchannel_spsc
¶ - #include <channel_spsc.hpp>
-
template<typename
-
namespace
-
namespace
Header hpx/synchronization/condition_variable.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
-
-
class
condition_variable
¶ - #include <condition_variable.hpp>
Public Functions
-
condition_variable
()¶
-
~condition_variable
()¶
-
void
notify_one
(error_code &ec = throws)¶
-
void
notify_all
(error_code &ec = throws)¶
-
void
wait
(std::unique_lock<mutex> &lock, error_code &ec = throws)¶
-
template<typename
Predicate
>
voidwait
(std::unique_lock<mutex> &lock, Predicate pred, error_code& = throws)¶
-
cv_status
wait_until
(std::unique_lock<mutex> &lock, util::steady_time_point const &abs_time, error_code &ec = throws)¶
-
template<typename
Predicate
>
boolwait_until
(std::unique_lock<mutex> &lock, util::steady_time_point const &abs_time, Predicate pred, error_code &ec = throws)¶
-
cv_status
wait_for
(std::unique_lock<mutex> &lock, util::steady_duration const &rel_time, error_code &ec = throws)¶
-
template<typename
Predicate
>
boolwait_for
(std::unique_lock<mutex> &lock, util::steady_duration const &rel_time, Predicate pred, error_code &ec = throws)¶
Private Types
-
using
mutex_type
= detail::condition_variable_data::mutex_type¶
-
-
class
condition_variable_any
¶ - #include <condition_variable.hpp>
Public Functions
-
condition_variable_any
()¶
-
~condition_variable_any
()¶
-
void
notify_one
(error_code &ec = throws)¶
-
void
notify_all
(error_code &ec = throws)¶
-
template<typename
Lock
>
voidwait
(Lock &lock, error_code &ec = throws)¶
-
template<typename
Lock
, typenamePredicate
>
voidwait
(Lock &lock, Predicate pred, error_code &ec = throws)¶
-
template<typename
Lock
>
cv_statuswait_until
(Lock &lock, util::steady_time_point const &abs_time, error_code &ec = throws)¶
-
template<typename
Lock
, typenamePredicate
>
boolwait_until
(Lock &lock, util::steady_time_point const &abs_time, Predicate pred, error_code &ec = throws)¶
-
template<typename
Lock
>
cv_statuswait_for
(Lock &lock, util::steady_duration const &rel_time, error_code &ec = throws)¶
-
template<typename
Lock
, typenamePredicate
>
boolwait_for
(Lock &lock, util::steady_duration const &rel_time, Predicate pred, error_code &ec = throws)¶
-
template<typename
Lock
, typenamePredicate
>
boolwait
(Lock &lock, stop_token stoken, Predicate pred, error_code &ec = throws)¶
-
template<typename
Lock
, typenamePredicate
>
boolwait_until
(Lock &lock, stop_token stoken, util::steady_time_point const &abs_time, Predicate pred, error_code &ec = throws)¶
-
template<typename
Lock
, typenamePredicate
>
boolwait_for
(Lock &lock, stop_token stoken, util::steady_duration const &rel_time, Predicate pred, error_code &ec = throws)¶
Private Types
-
using
mutex_type
= detail::condition_variable_data::mutex_type¶
-
-
class
-
namespace
-
namespace
Header hpx/synchronization/counting_semaphore.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
Typedefs
-
typedef counting_semaphore_var
counting_semaphore
¶
-
template<typename
Mutex
= hpx::lcos::local::spinlock, intN
= 0>
classcounting_semaphore_var
: private hpx::lcos::local::cpp20_counting_semaphore<PTRDIFF_MAX, Mutex>¶ - #include <counting_semaphore.hpp>
Public Functions
-
counting_semaphore_var
(counting_semaphore_var const&)¶
-
counting_semaphore_var &
operator=
(counting_semaphore_var const&)¶
Private Types
-
template<>
usingmutex_type
= Mutex¶
-
-
template<typename
Mutex
= hpx::lcos::local::spinlock>
classcpp20_binary_semaphore
: public hpx::lcos::local::cpp20_counting_semaphore<1, Mutex>¶ - #include <counting_semaphore.hpp>
-
template<std::ptrdiff_t
LeastMaxValue
= PTRDIFF_MAX, typenameMutex
= hpx::lcos::local::spinlock>
classcpp20_counting_semaphore
¶ - #include <counting_semaphore.hpp>
Public Functions
-
HPX_NON_COPYABLE
(cpp20_counting_semaphore)¶
-
~cpp20_counting_semaphore
()¶
-
bool
try_acquire
()¶
-
void
acquire
()¶
-
bool
try_acquire_until
(util::steady_time_point const &abs_time)¶
-
bool
try_acquire_for
(util::steady_duration const &rel_time)¶
Public Static Functions
-
static constexpr std::ptrdiff_t() hpx::lcos::local::cpp20_counting_semaphore::max()
Protected Types
-
template<>
usingmutex_type
= Mutex¶
-
-
typedef counting_semaphore_var
-
namespace
-
namespace
Header hpx/synchronization/event.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
-
class
event
¶ - #include <event.hpp>
Event semaphores can be used for synchronizing multiple threads that need to wait for an event to occur. When the event occurs, all threads waiting for the event are woken up.
Public Functions
-
event
()¶ Construct a new event semaphore.
-
bool
occurred
()¶ Check if the event has occurred.
-
void
wait
()¶ Wait for the event to occur.
-
void
set
()¶ Release all threads waiting on this semaphore.
-
void
reset
()¶ Reset the event.
Private Functions
-
void
wait_locked
(std::unique_lock<mutex_type> &l)¶
-
void
set_locked
(std::unique_lock<mutex_type> l)¶
-
-
class
-
namespace
-
namespace
Header hpx/synchronization/latch.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
-
class
cpp20_latch
¶ - #include <latch.hpp>
Latches are a thread coordination mechanism that allow one or more threads to block until an operation is completed. An individual latch is a singleuse object; once the operation has been completed, the latch cannot be reused.
Subclassed by hpx::lcos::local::latch
Public Functions
-
HPX_NON_COPYABLE
(cpp20_latch)¶
-
cpp20_latch
(std::ptrdiff_t count)¶ Initialize the latch
Requires: count >= 0. Synchronization: None Postconditions: counter_ == count.
-
~cpp20_latch
()¶ Requires: No threads are blocked at the synchronization point.
- Note
May be called even if some threads have not yet returned from wait() or count_down_and_wait(), provided that counter_ is 0.
- Note
The destructor might not return until all threads have exited wait() or count_down_and_wait().
- Note
It is the caller’s responsibility to ensure that no other thread enters wait() after one thread has called the destructor. This may require additional coordination.
-
void
count_down
(std::ptrdiff_t update)¶ Decrements counter_ by n. Does not block.
Requires: counter_ >= n and n >= 0.
Synchronization: Synchronizes with all calls that block on this latch and with all try_wait calls on this latch that return true .
- Exceptions
Nothing.
:
-
bool
try_wait
() const¶ Returns: With very low probability false. Otherwise counter == 0.
-
void
wait
() const¶ If counter_ is 0, returns immediately. Otherwise, blocks the calling thread at the synchronization point until counter_ reaches 0.
- Exceptions
Nothing.
:
Public Static Functions
-
static constexpr std::ptrdiff_t() hpx::lcos::local::cpp20_latch::max()
Returns: The maximum value of counter that the implementation supports.
Protected Attributes
-
util::cache_line_data<mutex_type>
mtx_
¶
-
util::cache_line_data<local::detail::condition_variable>
cond_
¶
-
bool
notified_
¶
-
-
class
latch
: public hpx::lcos::local::cpp20_latch¶ - #include <latch.hpp>
A latch maintains an internal counter_ that is initialized when the latch is created. Threads may block at a synchronization point waiting for counter_ to be decremented to 0. When counter_ reaches 0, all such blocked threads are released.
Calls to countdown_and_wait() , count_down() , wait() , is_ready(), count_up() , and reset() behave as atomic operations.
- Note
A local::latch is not an LCO in the sense that it has no global id and it can’t be triggered using the action (parcel) mechanism. Use lcos::latch instead if this is required. It is just a low level synchronization primitive allowing to synchronize a given number of threads.
Public Functions
-
latch
(std::ptrdiff_t count)¶ Initialize the latch
Requires: count >= 0. Synchronization: None Postconditions: counter_ == count.
-
~latch
()¶ Requires: No threads are blocked at the synchronization point.
- Note
May be called even if some threads have not yet returned from wait() or count_down_and_wait(), provided that counter_ is 0.
- Note
The destructor might not return until all threads have exited wait() or count_down_and_wait().
- Note
It is the caller’s responsibility to ensure that no other thread enters wait() after one thread has called the destructor. This may require additional coordination.
-
void
count_down_and_wait
()¶ Decrements counter_ by 1 . Blocks at the synchronization point until counter_ reaches 0.
Requires: counter_ > 0.
Synchronization: Synchronizes with all calls that block on this latch and with all is_ready calls on this latch that return true.
- Exceptions
Nothing.
:
-
bool
is_ready
() const¶ Returns: counter_ == 0. Does not block.
- Exceptions
Nothing.
:
-
void
abort_all
()¶
-
class
-
namespace
-
namespace
Header hpx/synchronization/lock_types.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
-
-
template<typename
Mutex
>
classupgrade_lock
¶ - #include <lock_types.hpp>
Public Types
-
template<>
usingmutex_type
= Mutex¶
Public Functions
-
upgrade_lock
(upgrade_lock const&)¶
-
upgrade_lock &
operator=
(upgrade_lock const&)¶
-
upgrade_lock
()¶
-
upgrade_lock
(Mutex &m_)¶
-
upgrade_lock
(upgrade_lock<Mutex> &&other)¶
-
upgrade_lock &
operator=
(upgrade_lock<Mutex> &&other)¶
-
void
swap
(upgrade_lock &other)¶
-
Mutex *
mutex
() const¶
-
Mutex *
release
()¶
-
~upgrade_lock
()¶
-
void
lock
()¶
-
bool
try_lock
()¶
-
void
unlock
()¶
-
operator bool
() const¶
-
bool
owns_lock
() const¶
Friends
-
friend
hpx::lcos::local::upgrade_to_unique_lock
-
template<>
-
template<typename
Mutex
>
classupgrade_to_unique_lock
¶ - #include <lock_types.hpp>
Public Types
-
template<>
usingmutex_type
= Mutex¶
Public Functions
-
upgrade_to_unique_lock
(upgrade_to_unique_lock const&)¶
-
upgrade_to_unique_lock &
operator=
(upgrade_to_unique_lock const&)¶
-
upgrade_to_unique_lock
(upgrade_lock<Mutex> &m_)¶
-
~upgrade_to_unique_lock
()¶
-
upgrade_to_unique_lock
(upgrade_to_unique_lock<Mutex> &&other)¶
-
upgrade_to_unique_lock &
operator=
(upgrade_to_unique_lock<Mutex> &&other)¶
-
void
swap
(upgrade_to_unique_lock &other)¶
-
operator bool
() const¶
-
bool
owns_lock
() const¶
-
Mutex *
mutex
() const¶
-
template<>
-
template<typename
-
namespace
-
namespace
Header hpx/synchronization/mutex.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
-
class
mutex
¶ - #include <mutex.hpp>
Subclassed by hpx::lcos::local::timed_mutex
Public Functions
-
mutex
(char const *const description = "")¶
-
~mutex
()¶
-
void
lock
(char const *description, error_code &ec = throws)¶
-
void
lock
(error_code &ec = throws)¶
-
bool
try_lock
(char const *description, error_code &ec = throws)¶
-
bool
try_lock
(error_code &ec = throws)¶
-
void
unlock
(error_code &ec = throws)¶
Protected Attributes
-
mutex_type
mtx_
¶
-
threads::thread_id_type
owner_id_
¶
-
detail::condition_variable
cond_
¶
-
-
class
timed_mutex
: private hpx::lcos::local::mutex¶ - #include <mutex.hpp>
Public Functions
-
HPX_NON_COPYABLE
(timed_mutex)¶
-
timed_mutex
(char const *const description = "")¶
-
~timed_mutex
()¶
-
bool
try_lock_until
(util::steady_time_point const &abs_time, char const *description, error_code &ec = throws)¶
-
bool
try_lock_until
(util::steady_time_point const &abs_time, error_code &ec = throws)¶
-
bool
try_lock_for
(util::steady_duration const &rel_time, char const *description, error_code &ec = throws)¶
-
bool
try_lock_for
(util::steady_duration const &rel_time, error_code &ec = throws)¶
-
-
class
-
namespace
-
namespace
threads
-
Functions
-
thread_id_type
get_self_id
()¶ The function get_self_id returns the HPX thread id of the current thread (or zero if the current thread is not a HPX thread).
-
thread_self *
get_self_ptr
()¶ The function get_self_ptr returns a pointer to the (OS thread specific) self reference to the current HPX thread.
-
thread_id_type
-
namespace
Header hpx/synchronization/no_mutex.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
-
struct
no_mutex
¶ - #include <no_mutex.hpp>
-
struct
-
namespace
-
namespace
Header hpx/synchronization/recursive_mutex.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
Typedefs
-
using
recursive_mutex
= detail::recursive_mutex_impl<>¶
-
using
-
namespace
-
namespace
Header hpx/synchronization/sliding_semaphore.hpp
¶
-
namespace
hpx
-
namespace
lcos
-
namespace
local
Typedefs
-
typedef sliding_semaphore_var
sliding_semaphore
¶
-
template<typename
Mutex
= hpx::lcos::local::spinlock>
classsliding_semaphore_var
¶ - #include <sliding_semaphore.hpp>
A semaphore is a protected variable (an entity storing a value) or abstract data type (an entity grouping several variables that may or may not be numerical) which constitutes the classic method for restricting access to shared resources, such as shared memory, in a multiprogramming environment. Semaphores exist in many variants, though usually the term refers to a counting semaphore, since a binary semaphore is better known as a mutex. A counting semaphore is a counter for a set of available resources, rather than a locked/unlocked flag of a single resource. It was invented by Edsger Dijkstra. Semaphores are the classic solution to preventing race conditions in the dining philosophers problem, although they do not prevent resource deadlocks.
Sliding semaphores can be used for synchronizing multiple threads as well: one thread waiting for several other threads to touch (signal) the semaphore, or several threads waiting for one other thread to touch this semaphore. The difference to a counting semaphore is that a sliding semaphore will not limit the number of threads which are allowed to proceed, but will make sure that the difference between the (arbitrary) number passed to set and wait does not exceed a given threshold.
Public Functions
-
sliding_semaphore_var
(std::int64_t max_difference, std::int64_t lower_limit = 0)¶ Construct a new sliding semaphore.
-
void
set_max_difference
(std::int64_t max_difference, std::int64_t lower_limit = 0)¶ Set/Change the difference that will cause the semaphore to trigger.
-
void
wait
(std::int64_t upper_limit)¶ Wait for the semaphore to be signaled.
- Parameters
upper_limit
: [in] The new upper limit. The calling thread will be suspended if the difference between this value and the largest lower_limit which was set by signal() is larger than the max_difference.
-
bool
try_wait
(std::int64_t upper_limit = 1)¶ Try to wait for the semaphore to be signaled.
- Return
The function returns true if the calling thread would not block if it was calling wait().
- Parameters
upper_limit
: [in] The new upper limit. The calling thread will be suspended if the difference between this value and the largest lower_limit which was set by signal() is larger than the max_difference.
-
void
signal
(std::int64_t lower_limit)¶ Signal the semaphore.
- Parameters
lower_limit
: [in] The new lower limit. This will update the current lower limit of this semaphore. It will also re-schedule all suspended threads for which their associated upper limit is not larger than the lower limit plus the max_difference.
Private Types
-
typedef Mutex
mutex_type
¶
-
-
typedef sliding_semaphore_var
-
namespace
-
namespace
Header hpx/synchronization/spinlock.hpp
¶
Header hpx/synchronization/spinlock_no_backoff.hpp
¶
Header hpx/synchronization/spinlock_pool.hpp
¶
Header hpx/synchronization/stop_token.hpp
¶
-
namespace
hpx
Functions
-
template<typename
Callback
>
stop_callback<typename std::decay<Callback>::type>make_stop_callback
(stop_token const &st, Callback &&cb)¶
-
template<typename
Callback
>
stop_callback<typename std::decay<Callback>::type>make_stop_callback
(stop_token &&st, Callback &&cb)¶
-
void
swap
(stop_token &lhs, stop_token &rhs)¶
-
void
swap
(stop_source &lhs, stop_source &rhs)¶
Variables
-
HPX_INLINE_CONSTEXPR_VARIABLE nostopstate_t hpx::nostopstate = {}
-
template<typename
Callback
>
classstop_callback
: private hpx::detail::stop_callback_base¶ - #include <stop_token.hpp>
Public Types
-
template<>
usingcallback_type
= Callback¶
Public Functions
-
template<typename
CB
, typenameEnable
= typename std::enable_if<std::is_constructible<Callback, CB>::value>::type>stop_callback
(stop_token const &st, CB &&cb)¶
-
template<typename
CB
, typenameEnable
= typename std::enable_if<std::is_constructible<Callback, CB>::value>::type>stop_callback
(stop_token &&st, CB &&cb)¶
-
~stop_callback
()¶
-
stop_callback
(stop_callback const&)¶
-
stop_callback
(stop_callback&&)¶
-
stop_callback &
operator=
(stop_callback const&)¶
-
stop_callback &
operator=
(stop_callback&&)¶
Private Functions
-
void
execute
()¶
-
template<>
-
class
stop_source
¶ - #include <stop_token.hpp>
Public Functions
-
stop_source
()¶
-
stop_source
(nostopstate_t)¶
-
stop_source
(stop_source const &rhs)¶
-
stop_source
(stop_source&&)¶
-
stop_source &
operator=
(stop_source const &rhs)¶
-
stop_source &
operator=
(stop_source&&)¶
-
~stop_source
()¶
-
void
swap
(stop_source &s)¶
-
HPX_NODISCARD stop_token hpx::stop_source::get_token() const
-
HPX_NODISCARD bool hpx::stop_source::stop_possible() const
-
HPX_NODISCARD bool hpx::stop_source::stop_requested() const
-
bool
request_stop
()¶
Friends
-
HPX_NODISCARD friend bool operator==(stop_source const & lhs, stop_source const & rhs)
-
HPX_NODISCARD friend bool operator!=(stop_source const & lhs, stop_source const & rhs)
-
-
class
stop_token
¶ - #include <stop_token.hpp>
Public Functions
-
stop_token
()¶
-
stop_token
(stop_token const &rhs)¶
-
stop_token
(stop_token&&)¶
-
stop_token &
operator=
(stop_token const &rhs)¶
-
stop_token &
operator=
(stop_token&&)¶
-
~stop_token
()¶
-
void
swap
(stop_token &s)¶
-
HPX_NODISCARD bool hpx::stop_token::stop_requested() const
-
HPX_NODISCARD bool hpx::stop_token::stop_possible() const
Friends
-
friend
hpx::stop_callback
-
friend
hpx::stop_source
-
HPX_NODISCARD friend bool operator==(stop_token const & lhs, stop_token const & rhs)
-
HPX_NODISCARD friend bool operator!=(stop_token const & lhs, stop_token const & rhs)
-
-
template<typename