123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #ifndef __BOOST_SORT_PARALLEL_DETAIL_UTIL_ATOMIC_HPP
- #define __BOOST_SORT_PARALLEL_DETAIL_UTIL_ATOMIC_HPP
- #include <ciso646>
- #include <atomic>
- #include <cassert>
- #include <type_traits>
- namespace boost
- {
- namespace sort
- {
- namespace common
- {
- namespace util
- {
- template<typename T>
- inline T atomic_read(std::atomic<T> &at_var)
- {
- return std::atomic_load_explicit < T > (&at_var, std::memory_order_acquire);
- };
- template<typename T, typename T2>
- inline T atomic_add(std::atomic<T> &at_var, T2 num)
- {
- static_assert (std::is_integral< T2 >::value, "Bad parameter");
- return std::atomic_fetch_add_explicit <T>
- (&at_var, (T) num, std::memory_order_acq_rel);
- };
- template<typename T, typename T2>
- inline T atomic_sub(std::atomic<T> &at_var, T2 num)
- {
- static_assert (std::is_integral< T2 >::value, "Bad parameter");
- return std::atomic_fetch_sub_explicit <T>
- (&at_var, (T) num, std::memory_order_acq_rel);
- };
- template<typename T, typename T2>
- inline void atomic_write(std::atomic<T> &at_var, T2 num)
- {
- static_assert (std::is_integral< T2 >::value, "Bad parameter");
- std::atomic_store_explicit <T>
- (&at_var, (T) num, std::memory_order_release);
- };
- template<typename T>
- struct counter_guard
- {
- typedef std::atomic<T> atomic_t;
- atomic_t &count;
- counter_guard(atomic_t & counter): count(counter) { };
- ~counter_guard() {atomic_sub(count, 1); };
- };
- };
- };
- };
- };
- #endif
|