concurrency¶
The contents of this module can be included with the header
hpx/modules/concurrency.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/concurrency.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/concurrency/barrier.hpp¶
Header hpx/concurrency/cache_line_data.hpp¶
- 
template<typename 
Data>
structcache_aligned_data<Data, std::false_type>¶ - #include <cache_line_data.hpp>
Public Functions
- 
cache_aligned_data()¶ 
- 
cache_aligned_data(Data &&data)¶ 
- 
cache_aligned_data(Data const &data)¶ 
Public Members
- 
Data 
data_¶ 
 - 
 
- 
template<typename 
Data>
structcache_aligned_data_derived<Data, std::false_type> : public Data¶ - #include <cache_line_data.hpp>
 
- 
namespace 
hpx - 
namespace 
threads 
- 
namespace 
util Typedefs
- 
using 
cache_line_data= cache_aligned_data<Data>¶ 
- 
template<typename 
Data, typenameNeedsPadding= typename detail::needs_padding<Data>::type>
structcache_aligned_data¶ - #include <cache_line_data.hpp>
Public Functions
- 
cache_aligned_data() 
- 
cache_aligned_data(Data &&data) 
- 
cache_aligned_data(Data const &data) 
 - 
 
- 
template<typename 
Data>
structcache_aligned_data<Data, std::false_type> - #include <cache_line_data.hpp>
Public Functions
- 
cache_aligned_data() 
- 
cache_aligned_data(Data &&data) 
- 
cache_aligned_data(Data const &data) 
Public Members
- 
Data 
data_ 
 - 
 
- 
template<typename 
Data, typenameNeedsPadding= typename detail::needs_padding<Data>::type>
structcache_aligned_data_derived: public Data¶ - #include <cache_line_data.hpp>
Public Functions
- 
cache_aligned_data_derived() 
- 
cache_aligned_data_derived(Data &&data) 
- 
cache_aligned_data_derived(Data const &data) 
Public Members
- 
template<>
charcacheline_pad[get_cache_line_padding_size(sizeof(Data))]¶ 
 - 
 
- 
using 
 
- 
namespace 
 
Header hpx/concurrency/concurrentqueue.hpp¶
Defines
- 
MOODYCAMEL_THREADLOCAL¶ 
- 
MOODYCAMEL_EXCEPTIONS_ENABLED¶ 
- 
MOODYCAMEL_TRY¶ 
- 
MOODYCAMEL_CATCH(...)¶ 
- 
MOODYCAMEL_RETHROW¶ 
- 
MOODYCAMEL_THROW(expr)¶ 
- 
MOODYCAMEL_NOEXCEPT¶ 
- 
MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr)¶ 
- 
MOODYCAMEL_NOEXCEPT_ASSIGN(type, valueType, expr)¶ 
- 
MOODYCAMEL_DELETE_FUNCTION¶ 
- 
namespace 
hpx - 
namespace 
concurrency¶ Functions
- 
template<typename 
T, typenameTraits>
voidswap(typename ConcurrentQueue<T, Traits>::ImplicitProducerKVP &a, typename ConcurrentQueue<T, Traits>::ImplicitProducerKVP &b)¶ 
- 
template<typename 
T, typenameTraits>
voidswap(ConcurrentQueue<T, Traits> &a, ConcurrentQueue<T, Traits> &b)¶ 
- 
void 
swap(ProducerToken &a, ProducerToken &b)¶ 
- 
void 
swap(ConsumerToken &a, ConsumerToken &b)¶ 
- 
template<typename 
T, typenameTraits= ConcurrentQueueDefaultTraits>
classConcurrentQueue¶ - #include <concurrentqueue.hpp>
Public Types
- 
typedef ::hpx::concurrency::ProducerToken 
producer_token_t¶ 
- 
typedef ::hpx::concurrency::ConsumerToken 
consumer_token_t¶ 
- 
typedef Traits::index_t 
index_t¶ 
- 
typedef Traits::size_t 
size_t¶ 
Public Functions
- 
ConcurrentQueue(size_t capacity = 6 * BLOCK_SIZE)¶ 
- 
~ConcurrentQueue()¶ 
- 
ConcurrentQueue(ConcurrentQueue const&)¶ 
- 
ConcurrentQueue &
operator=(ConcurrentQueue const&)¶ 
- 
ConcurrentQueue(ConcurrentQueue &&other)¶ 
- 
ConcurrentQueue &
operator=(ConcurrentQueue &&other)¶ 
- 
void 
swap(ConcurrentQueue &other)¶ 
- 
bool 
enqueue(T const &item)¶ 
- 
bool 
enqueue(T &&item)¶ 
- 
bool 
enqueue(producer_token_t const &token, T const &item)¶ 
- 
bool 
enqueue(producer_token_t const &token, T &&item)¶ 
- 
template<typename 
It>
boolenqueue_bulk(producer_token_t const &token, It itemFirst, size_t count)¶ 
- 
bool 
try_enqueue(T const &item)¶ 
- 
bool 
try_enqueue(T &&item)¶ 
- 
bool 
try_enqueue(producer_token_t const &token, T const &item)¶ 
- 
bool 
try_enqueue(producer_token_t const &token, T &&item)¶ 
- 
template<typename 
It>
booltry_enqueue_bulk(producer_token_t const &token, It itemFirst, size_t count)¶ 
- 
template<typename 
U>
booltry_dequeue(consumer_token_t &token, U &item)¶ 
- 
template<typename 
It>
size_ttry_dequeue_bulk(consumer_token_t &token, It itemFirst, size_t max)¶ 
- 
template<typename 
U>
booltry_dequeue_from_producer(producer_token_t const &producer, U &item)¶ 
- 
template<typename 
It>
size_ttry_dequeue_bulk_from_producer(producer_token_t const &producer, It itemFirst, size_t max)¶ 
Public Static Functions
- 
static bool 
is_lock_free()¶ 
Public Static Attributes
- 
const size_t 
EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD= static_cast<size_t>(Traits::EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD)¶ 
- 
const size_t 
EXPLICIT_INITIAL_INDEX_SIZE= static_cast<size_t>(Traits::EXPLICIT_INITIAL_INDEX_SIZE)¶ 
- 
const size_t 
IMPLICIT_INITIAL_INDEX_SIZE= static_cast<size_t>(Traits::IMPLICIT_INITIAL_INDEX_SIZE)¶ 
- 
const size_t 
INITIAL_IMPLICIT_PRODUCER_HASH_SIZE= static_cast<size_t>(Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE)¶ 
- 
const std::uint32_t 
EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE= static_cast<std::uint32_t>(Traits::EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE)¶ 
- 
const size_t hpx::concurrency::ConcurrentQueue::MAX_SUBQUEUE_SIZE = (details::const_numeric_max<size_t>::value - static_cast<size_t>(Traits::MAX_SUBQUEUE_SIZE) < BLOCK_SIZE) ? details::const_numeric_max<size_t>::value : ((static_cast<size_t>(Traits::MAX_SUBQUEUE_SIZE) + (BLOCK_SIZE - 1)) / BLOCK_SIZE * BLOCK_SIZE) 
Private Types
Private Functions
- 
ConcurrentQueue &
swap_internal(ConcurrentQueue &other)¶ 
- 
template<AllocationMode 
canAlloc, typenameU>
boolinner_enqueue(producer_token_t const &token, U &&element)¶ 
- 
template<AllocationMode 
canAlloc, typenameU>
boolinner_enqueue(U &&element)¶ 
- 
template<AllocationMode 
canAlloc, typenameIt>
boolinner_enqueue_bulk(producer_token_t const &token, It itemFirst, size_t count)¶ 
- 
template<AllocationMode 
canAlloc, typenameIt>
boolinner_enqueue_bulk(It itemFirst, size_t count)¶ 
- 
bool 
update_current_producer_after_rotation(consumer_token_t &token)¶ 
- 
template<AllocationMode 
canAlloc>
Block *requisition_block()¶ 
- 
ProducerBase *
recycle_or_create_producer(bool isExplicit)¶ 
- 
ProducerBase *
recycle_or_create_producer(bool isExplicit, bool &recycled)¶ 
- 
ProducerBase *
add_producer(ProducerBase *producer)¶ 
- 
void 
reown_producers()¶ 
- 
void 
populate_initial_implicit_producer_hash()¶ 
- 
void 
swap_implicit_producer_hashes(ConcurrentQueue &other)¶ 
- 
ImplicitProducer *
get_or_add_implicit_producer()¶ 
Private Members
- 
std::atomic<ProducerBase*> 
producerListTail¶ 
- 
std::atomic<ImplicitProducerHash*> 
implicitProducerHash¶ 
- 
ImplicitProducerHash 
initialImplicitProducerHash¶ 
- 
std::array<ImplicitProducerKVP, INITIAL_IMPLICIT_PRODUCER_HASH_SIZE> 
initialImplicitProducerHashEntries¶ 
Private Static Functions
Friends
- 
friend 
hpx::concurrency::ProducerToken 
- 
friend 
hpx::concurrency::ConsumerToken 
- 
friend 
hpx::concurrency::ExplicitProducer 
- 
friend 
hpx::concurrency::ImplicitProducer 
- 
friend 
hpx::concurrency::ConcurrentQueueTests 
- 
struct 
Block¶ Public Functions
- 
template<>
Block()¶ 
- 
template<InnerQueueContext 
context>
boolis_empty() const¶ 
- 
template<InnerQueueContext 
context>
boolset_empty(index_t i)¶ 
- 
template<InnerQueueContext 
context>
boolset_many_empty(index_t i, size_t count)¶ 
- 
template<InnerQueueContext 
context>
voidset_all_empty()¶ 
- 
template<InnerQueueContext 
context>
voidreset_empty()¶ 
- 
template<>
T *operator[](index_t idx)¶ 
- 
template<>
T const *operator[](index_t idx) const¶ 
Public Members
- 
template<>
charelements[sizeof(T) *BLOCK_SIZE]¶ 
- 
template<>
details::max_align_tdummy¶ 
- 
template<>
Block *next¶ 
- 
std::atomic<bool> hpx::concurrency::ConcurrentQueue< T, Traits >::Block::emptyFlags[BLOCK_SIZE<=EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD ? BLOCK_SIZE :1] 
- 
template<>
booldynamicallyAllocated¶ 
Private Members
- 
template<>
union hpx::concurrency::ConcurrentQueue::Block::[anonymous] [anonymous]¶ 
- 
template<>
 
- 
struct 
ExplicitProducer: public hpx::concurrency::ConcurrentQueue<T, Traits>::ProducerBase¶ Public Functions
- 
template<>
ExplicitProducer(ConcurrentQueue *parent)¶ 
- 
template<>
~ExplicitProducer()¶ 
- 
template<AllocationMode 
allocMode, typenameU>
boolenqueue(U &&element)¶ 
- 
template<typename 
U>
booldequeue(U &element)¶ 
- 
template<AllocationMode 
allocMode, typenameIt>
boolenqueue_bulk(It itemFirst, size_t count)¶ 
- 
template<typename 
It>
size_tdequeue_bulk(It &itemFirst, size_t max)¶ 
Private Functions
- 
template<>
boolnew_block_index(size_t numberOfFilledSlotsToExpose)¶ 
Private Members
- 
template<>
size_tpr_blockIndexSlotsUsed¶ 
- 
template<>
size_tpr_blockIndexSize¶ 
- 
template<>
size_tpr_blockIndexFront¶ 
- 
template<>
BlockIndexEntry *pr_blockIndexEntries¶ 
- 
template<>
void *pr_blockIndexRaw¶ 
- 
struct 
BlockIndexEntry¶ 
- 
struct 
BlockIndexHeader¶ 
- 
template<>
 
- 
template<typename 
N>
structFreeList¶ Public Functions
- 
template<>
FreeList()¶ 
- 
template<>
voidswap(FreeList &other)¶ 
- 
template<>
FreeList &operator=(FreeList const&)¶ 
- 
template<>
voidadd(N *node)¶ 
- 
template<>
N *try_get()¶ 
- 
template<>
N *head_unsafe() const¶ 
Private Functions
- 
template<>
voidadd_knowing_refcount_is_zero(N *node)¶ 
- 
template<>
 
- 
struct 
ImplicitProducer: public hpx::concurrency::ConcurrentQueue<T, Traits>::ProducerBase¶ Public Functions
- 
template<>
ImplicitProducer(ConcurrentQueue *parent)¶ 
- 
template<>
~ImplicitProducer()¶ 
- 
template<AllocationMode 
allocMode, typenameU>
boolenqueue(U &&element)¶ 
- 
template<typename 
U>
booldequeue(U &element)¶ 
- 
template<AllocationMode 
allocMode, typenameIt>
boolenqueue_bulk(It itemFirst, size_t count)¶ 
- 
template<typename 
It>
size_tdequeue_bulk(It &itemFirst, size_t max)¶ 
Private Functions
- 
template<AllocationMode 
allocMode>
boolinsert_block_index_entry(BlockIndexEntry *&idxEntry, index_t blockStartIndex)¶ 
- 
template<>
voidrewind_block_index_tail()¶ 
- 
template<>
BlockIndexEntry *get_block_index_entry_for_index(index_t index) const¶ 
- 
template<>
size_tget_block_index_index_for_index(index_t index, BlockIndexHeader *&localBlockIndex) const¶ 
- 
template<>
boolnew_block_index()¶ 
Private Members
- 
template<>
size_tnextBlockIndexCapacity¶ 
Private Static Attributes
- 
template<>
const index_tINVALID_BLOCK_BASE= 1¶ 
- 
struct 
BlockIndexEntry¶ 
- 
struct 
BlockIndexHeader¶ 
- 
template<>
 
- 
struct 
ImplicitProducerHash¶ 
- 
struct 
ImplicitProducerKVP¶ Public Functions
- 
template<>
ImplicitProducerKVP()¶ 
- 
template<>
ImplicitProducerKVP(ImplicitProducerKVP &&other)¶ 
- 
template<>
ImplicitProducerKVP &operator=(ImplicitProducerKVP &&other)¶ 
- 
template<>
voidswap(ImplicitProducerKVP &other)¶ 
- 
template<>
 
- 
struct 
ProducerBase: public hpx::concurrency::details::ConcurrentQueueProducerTypelessBase¶ Public Functions
- 
template<>
ProducerBase(ConcurrentQueue *parent_, bool isExplicit_)¶ 
- 
template<>
virtual~ProducerBase()¶ 
- 
template<typename 
U>
booldequeue(U &element)¶ 
- 
template<typename 
It>
size_tdequeue_bulk(It &itemFirst, size_t max)¶ 
- 
template<>
ProducerBase *next_prod() const¶ 
- 
template<>
size_tsize_approx() const¶ 
- 
template<>
index_tgetTail() const¶ 
- 
template<>
 
 - 
typedef ::hpx::concurrency::ProducerToken 
 
- 
struct 
ConcurrentQueueDefaultTraits¶ - #include <concurrentqueue.hpp>
Public Static Attributes
- 
const size_t 
MAX_SUBQUEUE_SIZE= details::const_numeric_max<size_t>::value¶ 
 - 
const size_t 
 
- 
struct 
ConsumerToken¶ - #include <concurrentqueue.hpp>
Public Functions
- 
ConsumerToken(ConsumerToken &&other)¶ 
- 
ConsumerToken &
operator=(ConsumerToken &&other)¶ 
- 
void 
swap(ConsumerToken &other)¶ 
- 
ConsumerToken(ConsumerToken const&)¶ 
- 
ConsumerToken &
operator=(ConsumerToken const&)¶ 
Private Members
- 
details::ConcurrentQueueProducerTypelessBase *
currentProducer¶ 
- 
details::ConcurrentQueueProducerTypelessBase *
desiredProducer¶ 
Friends
- 
friend 
hpx::concurrency::ConcurrentQueue 
- 
friend 
hpx::concurrency::ConcurrentQueueTests 
 - 
 
- 
struct 
ProducerToken¶ - #include <concurrentqueue.hpp>
Public Functions
- 
ProducerToken(ProducerToken &&other)¶ 
- 
ProducerToken &
operator=(ProducerToken &&other)¶ 
- 
void 
swap(ProducerToken &other)¶ 
- 
bool 
valid() const¶ 
- 
~ProducerToken()¶ 
- 
ProducerToken(ProducerToken const&)¶ 
- 
ProducerToken &
operator=(ProducerToken const&)¶ 
Protected Attributes
- 
details::ConcurrentQueueProducerTypelessBase *
producer¶ 
Friends
- 
friend 
hpx::concurrency::ConcurrentQueue 
- 
friend 
hpx::concurrency::ConcurrentQueueTests 
 - 
 
- 
namespace 
details¶ - 
Functions
- 
static thread_id_t 
thread_id()¶ 
- 
static bool() hpx::concurrency::details::likely(bool x) 
- 
static bool() hpx::concurrency::details::unlikely(bool x) 
- 
static size_t 
hash_thread_id(thread_id_t id)¶ 
- 
template<typename 
U>
static char *align_for(char *ptr)¶ 
- 
template<bool 
use32>
struct_hash_32_or_64¶ - #include <concurrentqueue.hpp>
 
- 
template<>
struct_hash_32_or_64<1>¶ - #include <concurrentqueue.hpp>
 
- 
struct 
ConcurrentQueueProducerTypelessBase¶ - #include <concurrentqueue.hpp>
Public Functions
- 
ConcurrentQueueProducerTypelessBase()¶ 
Public Members
- 
ProducerToken *
token¶ 
 - 
 
- 
template<typename 
T>
structconst_numeric_max¶ - #include <concurrentqueue.hpp>
Public Static Attributes
- 
const T hpx::concurrency::details::const_numeric_max::value= std::numeric_limits<T>::is_signed ? (static_cast<T>(1) << (sizeof(T) * CHAR_BIT - 1)) - static_cast<T>(1) : static_cast<T>(-1) 
 - 
 
- 
union 
max_align_t¶ - #include <concurrentqueue.hpp>
 
- 
template<bool 
Enable>
structnomove_if¶ - #include <concurrentqueue.hpp>
 
- 
template<>
structnomove_if<false>¶ - #include <concurrentqueue.hpp>
 
- 
template<>
structstatic_is_lock_free<bool>¶ - #include <concurrentqueue.hpp>
 
- 
template<typename 
U>
structstatic_is_lock_free<U*>¶ - #include <concurrentqueue.hpp>
Public Types
- 
enum [anonymous]¶
 Values:
- 
value= ATOMIC_POINTER_LOCK_FREE 
- 
 
 - 
enum [anonymous]¶
 
- 
template<typename 
T>
structstatic_is_lock_free_num¶ - #include <concurrentqueue.hpp>
Public Types
- 
enum [anonymous]¶
 Values:
- 
value= 0 
- 
 
 - 
enum [anonymous]¶
 
- 
template<>
structstatic_is_lock_free_num<int>¶ - #include <concurrentqueue.hpp>
Public Types
- 
enum [anonymous]¶
 Values:
- 
value= ATOMIC_INT_LOCK_FREE 
- 
 
 - 
enum [anonymous]¶
 
- 
template<>
structstatic_is_lock_free_num<long>¶ - #include <concurrentqueue.hpp>
Public Types
- 
enum [anonymous]¶
 Values:
- 
value= ATOMIC_LONG_LOCK_FREE 
- 
 
 - 
enum [anonymous]¶
 
- 
template<>
structstatic_is_lock_free_num<long long>¶ - #include <concurrentqueue.hpp>
Public Types
- 
enum [anonymous]¶
 Values:
- 
value= ATOMIC_LLONG_LOCK_FREE 
- 
 
 - 
enum [anonymous]¶
 
- 
template<>
structstatic_is_lock_free_num<short>¶ - #include <concurrentqueue.hpp>
Public Types
- 
enum [anonymous]¶
 Values:
- 
value= ATOMIC_SHORT_LOCK_FREE 
- 
 
 - 
enum [anonymous]¶
 
- 
template<>
structstatic_is_lock_free_num<signed char>¶ - #include <concurrentqueue.hpp>
Public Types
- 
enum [anonymous]¶
 Values:
- 
value= ATOMIC_CHAR_LOCK_FREE 
- 
 
 - 
enum [anonymous]¶
 
- 
template<typename 
thread_id_t>
structthread_id_converter¶ - #include <concurrentqueue.hpp>
Public Static Functions
- 
static thread_id_hash_t 
prehash(thread_id_t const &x)¶ 
 - 
static thread_id_hash_t 
 
 - 
static thread_id_t 
 
- 
template<typename 
 
- 
namespace 
 
Header hpx/concurrency/deque.hpp¶
- 
namespace 
boost¶ - 
namespace 
lockfree¶ - 
- 
template<typename 
T, typenamefreelist_t= caching_freelist_t, typenameAlloc= std::allocator<T>>
structdeque¶ - #include <deque.hpp>
Public Types
- 
template<>
usingnode= deque_node<T>¶ 
- 
template<>
usinganchor= deque_anchor<T>¶ 
- 
template<>
usingnode_allocator= typename std::allocator_traits<Alloc>::template rebind_alloc<node>¶ 
- 
template<>
usingpool= typename std::conditional<std::is_same<freelist_t, caching_freelist_t>::value, caching_freelist<node, node_allocator>, static_freelist<node, node_allocator>>::type¶ 
Public Functions
- 
HPX_NON_COPYABLE(deque)¶ 
- 
~deque()¶ 
- 
bool 
empty() const¶ 
- 
bool 
is_lock_free() const¶ 
- 
bool 
push_left(T const &data)¶ 
- 
bool 
push_right(T const &data)¶ 
- 
bool 
pop_left(T &r)¶ 
- 
bool 
pop_left(T *r)¶ 
- 
bool 
pop_right(T &r)¶ 
- 
bool 
pop_right(T *r)¶ 
 - 
template<>
 
- 
template<typename 
T>
structdeque_anchor¶ - #include <deque.hpp>
Public Functions
- 
deque_anchor()¶ 
- 
deque_anchor(deque_anchor const &p)¶ 
- 
deque_anchor(pair const &p)¶ 
- 
pair 
lrs() volatile const¶ 
- 
node *
left() volatile const¶ 
- 
node *
right() volatile const¶ 
- 
tag_t 
status() volatile const¶ 
- 
tag_t 
tag() volatile const¶ 
- 
bool 
cas(deque_anchor &expected, deque_anchor const &desired) volatile¶ 
- 
bool 
cas(pair &expected, deque_anchor const &desired) volatile¶ 
- 
bool 
cas(deque_anchor &expected, pair const &desired) volatile¶ 
- 
bool 
cas(pair &expected, pair const &desired) volatile¶ 
- 
bool 
operator==(volatile deque_anchor const &rhs) const¶ 
- 
bool 
operator!=(volatile deque_anchor const &rhs) const¶ 
- 
bool 
operator==(volatile pair const &rhs) const¶ 
- 
bool 
operator!=(volatile pair const &rhs) const¶ 
- 
bool 
is_lock_free() const¶ 
Private Members
- 
atomic_pair 
pair_¶ 
 - 
 
- 
template<typename 
T>
structdeque_node¶ - #include <deque.hpp>
Public Types
- 
typedef detail::tagged_ptr<deque_node> 
pointer¶ 
Public Functions
- 
deque_node()¶ 
- 
deque_node(deque_node const &p)¶ 
- 
deque_node(deque_node *lptr, deque_node *rptr, T const &v, tag_t ltag = 0, tag_t rtag = 0)¶ 
 - 
typedef detail::tagged_ptr<deque_node> 
 
 - 
template<typename 
 
- 
namespace