Thread System 0.3.1
High-performance C++20 thread pool with work stealing and DAG scheduling
Loading...
Searching...
No Matches
kcenon::thread::atomic_with_wait< T > Class Template Reference

RAII wrapper to add wait/notify to atomic variables. More...

#include <atomic_wait.h>

Collaboration diagram for kcenon::thread::atomic_with_wait< T >:
Collaboration graph

Public Member Functions

 atomic_with_wait () noexcept
 
 atomic_with_wait (T initial) noexcept
 
 atomic_with_wait (const atomic_with_wait &)=delete
 
atomic_with_waitoperator= (const atomic_with_wait &)=delete
 
load (std::memory_order order=std::memory_order_seq_cst) const noexcept
 
void store (T desired, std::memory_order order=std::memory_order_seq_cst) noexcept
 
exchange (T desired, std::memory_order order=std::memory_order_seq_cst) noexcept
 
bool compare_exchange_weak (T &expected, T desired, std::memory_order order=std::memory_order_seq_cst) noexcept
 
bool compare_exchange_strong (T &expected, T desired, std::memory_order order=std::memory_order_seq_cst) noexcept
 
void wait (T old, std::memory_order order=std::memory_order_seq_cst) noexcept
 
void notify_one () noexcept
 
void notify_all () noexcept
 
 operator T () const noexcept
 
operator= (T desired) noexcept
 
template<typename U = T>
std::enable_if< std::is_integral< U >::value, U >::type fetch_add (T arg, std::memory_order order=std::memory_order_seq_cst) noexcept
 
template<typename U = T>
std::enable_if< std::is_integral< U >::value, U >::type fetch_sub (T arg, std::memory_order order=std::memory_order_seq_cst) noexcept
 
template<typename U = T>
std::enable_if< std::is_integral< U >::value, U >::type operator++ () noexcept
 
template<typename U = T>
std::enable_if< std::is_integral< U >::value, U >::type operator++ (int) noexcept
 
template<typename U = T>
std::enable_if< std::is_integral< U >::value, U >::type operator-- () noexcept
 
template<typename U = T>
std::enable_if< std::is_integral< U >::value, U >::type operator-- (int) noexcept
 

Private Attributes

std::atomic< T > value_
 
atomic_wait_helper< T > waiter_
 

Detailed Description

template<typename T>
class kcenon::thread::atomic_with_wait< T >

RAII wrapper to add wait/notify to atomic variables.

This class combines std::atomic with atomic_wait_helper to provide a drop-in replacement for C++20's atomic with wait/notify support.

Template Parameters
TThe value type

Usage:

// Thread 1
value.wait(0);
// Thread 2
value.store(1);
value.notify_one();
RAII wrapper to add wait/notify to atomic variables.
void wait(T old, std::memory_order order=std::memory_order_seq_cst) noexcept

Definition at line 169 of file atomic_wait.h.

Constructor & Destructor Documentation

◆ atomic_with_wait() [1/3]

template<typename T >
kcenon::thread::atomic_with_wait< T >::atomic_with_wait ( )
inlinenoexcept

Definition at line 171 of file atomic_wait.h.

171: value_(T{}) {}

◆ atomic_with_wait() [2/3]

template<typename T >
kcenon::thread::atomic_with_wait< T >::atomic_with_wait ( T initial)
inlineexplicitnoexcept

Definition at line 172 of file atomic_wait.h.

172: value_(initial) {}

◆ atomic_with_wait() [3/3]

template<typename T >
kcenon::thread::atomic_with_wait< T >::atomic_with_wait ( const atomic_with_wait< T > & )
delete

Member Function Documentation

◆ compare_exchange_strong()

template<typename T >
bool kcenon::thread::atomic_with_wait< T >::compare_exchange_strong ( T & expected,
T desired,
std::memory_order order = std::memory_order_seq_cst )
inlinenoexcept

Definition at line 196 of file atomic_wait.h.

197 {
198 return value_.compare_exchange_strong(expected, desired, order);
199 }

References kcenon::thread::atomic_with_wait< T >::value_.

◆ compare_exchange_weak()

template<typename T >
bool kcenon::thread::atomic_with_wait< T >::compare_exchange_weak ( T & expected,
T desired,
std::memory_order order = std::memory_order_seq_cst )
inlinenoexcept

Definition at line 191 of file atomic_wait.h.

192 {
193 return value_.compare_exchange_weak(expected, desired, order);
194 }

References kcenon::thread::atomic_with_wait< T >::value_.

◆ exchange()

template<typename T >
T kcenon::thread::atomic_with_wait< T >::exchange ( T desired,
std::memory_order order = std::memory_order_seq_cst )
inlinenoexcept

Definition at line 187 of file atomic_wait.h.

187 {
188 return value_.exchange(desired, order);
189 }

References kcenon::thread::atomic_with_wait< T >::value_.

◆ fetch_add()

template<typename T >
template<typename U = T>
std::enable_if< std::is_integral< U >::value, U >::type kcenon::thread::atomic_with_wait< T >::fetch_add ( T arg,
std::memory_order order = std::memory_order_seq_cst )
inlinenoexcept

Definition at line 266 of file atomic_wait.h.

266 {
267 return value_.fetch_add(arg, order);
268 }

References kcenon::thread::atomic_with_wait< T >::value_.

Referenced by kcenon::thread::atomic_with_wait< T >::operator++(), and kcenon::thread::atomic_with_wait< T >::operator++().

Here is the caller graph for this function:

◆ fetch_sub()

template<typename T >
template<typename U = T>
std::enable_if< std::is_integral< U >::value, U >::type kcenon::thread::atomic_with_wait< T >::fetch_sub ( T arg,
std::memory_order order = std::memory_order_seq_cst )
inlinenoexcept

Definition at line 272 of file atomic_wait.h.

272 {
273 return value_.fetch_sub(arg, order);
274 }

References kcenon::thread::atomic_with_wait< T >::value_.

Referenced by kcenon::thread::atomic_with_wait< T >::operator--(), and kcenon::thread::atomic_with_wait< T >::operator--().

Here is the caller graph for this function:

◆ load()

template<typename T >
T kcenon::thread::atomic_with_wait< T >::load ( std::memory_order order = std::memory_order_seq_cst) const
inlinenoexcept

Definition at line 179 of file atomic_wait.h.

179 {
180 return value_.load(order);
181 }

References kcenon::thread::atomic_with_wait< T >::value_.

Referenced by kcenon::thread::atomic_with_wait< T >::operator T().

Here is the caller graph for this function:

◆ notify_all()

template<typename T >
void kcenon::thread::atomic_with_wait< T >::notify_all ( )
inlinenoexcept

Definition at line 210 of file atomic_wait.h.

210 {
211 waiter_.notify_all();
212 }
atomic_wait_helper< T > waiter_

References kcenon::thread::atomic_with_wait< T >::waiter_.

◆ notify_one()

template<typename T >
void kcenon::thread::atomic_with_wait< T >::notify_one ( )
inlinenoexcept

Definition at line 206 of file atomic_wait.h.

206 {
207 waiter_.notify_one();
208 }

References kcenon::thread::atomic_with_wait< T >::waiter_.

◆ operator T()

template<typename T >
kcenon::thread::atomic_with_wait< T >::operator T ( ) const
inlinenoexcept

Definition at line 215 of file atomic_wait.h.

215 {
216 return load();
217 }
T load(std::memory_order order=std::memory_order_seq_cst) const noexcept

References kcenon::thread::atomic_with_wait< T >::load().

Here is the call graph for this function:

◆ operator++() [1/2]

template<typename T >
template<typename U = T>
std::enable_if< std::is_integral< U >::value, U >::type kcenon::thread::atomic_with_wait< T >::operator++ ( )
inlinenoexcept

Definition at line 278 of file atomic_wait.h.

278 {
279 return fetch_add(1) + 1;
280 }
std::enable_if< std::is_integral< U >::value, U >::type fetch_add(T arg, std::memory_order order=std::memory_order_seq_cst) noexcept

References kcenon::thread::atomic_with_wait< T >::fetch_add().

Here is the call graph for this function:

◆ operator++() [2/2]

template<typename T >
template<typename U = T>
std::enable_if< std::is_integral< U >::value, U >::type kcenon::thread::atomic_with_wait< T >::operator++ ( int )
inlinenoexcept

Definition at line 284 of file atomic_wait.h.

284 {
285 return fetch_add(1);
286 }

References kcenon::thread::atomic_with_wait< T >::fetch_add().

Here is the call graph for this function:

◆ operator--() [1/2]

template<typename T >
template<typename U = T>
std::enable_if< std::is_integral< U >::value, U >::type kcenon::thread::atomic_with_wait< T >::operator-- ( )
inlinenoexcept

Definition at line 290 of file atomic_wait.h.

290 {
291 return fetch_sub(1) - 1;
292 }
std::enable_if< std::is_integral< U >::value, U >::type fetch_sub(T arg, std::memory_order order=std::memory_order_seq_cst) noexcept

References kcenon::thread::atomic_with_wait< T >::fetch_sub().

Here is the call graph for this function:

◆ operator--() [2/2]

template<typename T >
template<typename U = T>
std::enable_if< std::is_integral< U >::value, U >::type kcenon::thread::atomic_with_wait< T >::operator-- ( int )
inlinenoexcept

Definition at line 296 of file atomic_wait.h.

296 {
297 return fetch_sub(1);
298 }

References kcenon::thread::atomic_with_wait< T >::fetch_sub().

Here is the call graph for this function:

◆ operator=() [1/2]

template<typename T >
atomic_with_wait & kcenon::thread::atomic_with_wait< T >::operator= ( const atomic_with_wait< T > & )
delete

◆ operator=() [2/2]

template<typename T >
T kcenon::thread::atomic_with_wait< T >::operator= ( T desired)
inlinenoexcept

Definition at line 220 of file atomic_wait.h.

220 {
221 store(desired);
222 return desired;
223 }
void store(T desired, std::memory_order order=std::memory_order_seq_cst) noexcept

References kcenon::thread::atomic_with_wait< T >::store().

Here is the call graph for this function:

◆ store()

template<typename T >
void kcenon::thread::atomic_with_wait< T >::store ( T desired,
std::memory_order order = std::memory_order_seq_cst )
inlinenoexcept

Definition at line 183 of file atomic_wait.h.

183 {
184 value_.store(desired, order);
185 }

References kcenon::thread::atomic_with_wait< T >::value_.

Referenced by kcenon::thread::atomic_with_wait< T >::operator=().

Here is the caller graph for this function:

◆ wait()

template<typename T >
void kcenon::thread::atomic_with_wait< T >::wait ( T old,
std::memory_order order = std::memory_order_seq_cst )
inlinenoexcept

Definition at line 202 of file atomic_wait.h.

202 {
203 waiter_.wait(value_, old);
204 }

References kcenon::thread::atomic_with_wait< T >::value_, and kcenon::thread::atomic_with_wait< T >::waiter_.

Member Data Documentation

◆ value_

◆ waiter_


The documentation for this class was generated from the following file: