C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)

来源:互联网 发布:张家界玻璃桥网络购票 编辑:程序博客网 时间:2024/05/14 16:55

前面三篇文章《C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)》、《C++11 并发指南六( <atomic> 类型详解二 std::atomic )》、《C++11 并发指南六(atomic 类型详解三 std::atomic (续))》都是采用 C++ 的方式介绍原子对象,本节我会给大家介绍 C++11 原子操作中 C 风格的 API。

总地来说,C++11 标准中规定了两大类原子对象,std::atomic_flag 和 std::atomic,前者 std::atomic_flag 一种最简单的原子布尔类型,只支持两种操作,test-and-set 和 clear。而 std::atomic 是模板类,一个模板类型为 T 的原子对象中封装了一个类型为 T 的值,并且C++11 标准中除了定义基本 std::atomic 模板类型外,还提供了针对整形(integral)和指针类型的特化实现,提供了大量的 API,极大地方便了开发者使用。下面我分别介绍基于 std::atomic_flag 和 std::atomic 的 C 风格 API。

基于 std::atomic_flag 类型的 C 风格 API

bool atomic_flag_test_and_set (volatile atomic_flag* obj) noexcept;bool atomic_flag_test_and_set (atomic_flag* obj) noexcept;
bool atomic_flag_test_and_set (volatile atomic_flag* obj, memory_order sync) noexcept;bool atomic_flag_test_and_set (atomic_flag* obj, memory_order sync) noexcept;
Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_releaseReleasememory_order_acq_relAcquire/Releasememory_order_seq_cstSequentially consistent
void atomic_flag_clear (volatile atomic_flag* obj) noexcept;void atomic_flag_clear (atomic_flag* obj) noexcept;
void atomic_flag_clear (volatile atomic_flag* obj, memory_order sync) noexcept;void atomic_flag_clear (atomic_flag* obj, memory_order sync) noexcept;
Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_releaseReleasememory_order_acq_relAcquire/Releasememory_order_seq_cstSequentially consistent

基于 std::atomic 模板类型的 C 风格 API

template (1)
template <class T> bool atomic_is_lock_free (const volatile atomic<T>* obj) noexcept;template <class T> bool atomic_is_lock_free (const atomic<T>* obj) noexcept;
overloads (2)
bool atomic_is_lock_free (const volatile A* obj) noexcept;bool atomic_is_lock_free (const A* obj) noexcept;
template (1)
template <class T> void atomic_init (volatile atomic<T>* obj, T val) noexcept;template <class T> void atomic_init (atomic<T>* obj, T val) noexcept;
overloads (2)
void atomic_init (volatile A* obj, T val) noexcept;void atomic_init (A* obj, T val) noexcept;
template (1)
template <class T> void atomic_store (volatile atomic<T>* obj, T val) noexcept;template <class T> void atomic_store (atomic<T>* obj, T val) noexcept;
overloads (2)
void atomic_store (volatile A* obj, T val) noexcept;void atomic_store (A* obj, T val) noexcept;
Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_releaseReleasememory_order_seq_cstSequentially consistenttemplate (1)
template <class T> T atomic_load (const volatile atomic<T>* obj) noexcept;template <class T> T atomic_load (const atomic<T>* obj) noexcept;
overloads (2)
T atomic_load (const volatile A* obj) noexcept;T atomic_load (const A* obj) noexcept;
template (1)
template <class T>T atomic_load_explicit (const volatile atomic<T>* obj, memory_order sync) noexcept;template <class T>T atomic_load_explicit (const atomic<T>* obj, memory_order sync) noexcept;
overloads (2)
T atomic_load_explicit (const volatile A* obj, memory_order sync) noexcept;T atomic_load_explicit (const A* obj, memory_order sync) noexcept;
Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_seq_cstSequentially consistenttemplate (1)
template <class T> T atomic_exchange (volatile atomic<T>* obj, T val) noexcept;template <class T> T atomic_exchange (atomic<T>* obj, T val) noexcept;
overloads (2)
T atomic_exchange (volatile A* obj, T val) noexcept;T atomic_exchange (A* obj, T val) noexcept;
template (1)
template <class T>T atomic_store_explicit (volatile atomic<T>* obj, T val, memory_order sync) noexcept;template <class T>T atomic_store_explicit (atomic<T>* obj, T val, memory_order sync) noexcept;
overloads (2)
T atomic_store_explicit (volatile A* obj, T val, memory_order sync) noexcept;T atomic_store_explicit (A* obj, T val, memory_order sync) noexcept;
Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_releaseReleasememory_order_acq_relAcquire/Releasememory_order_seq_cstSequentially consistenttemplate (1)
template <class T>bool atomic_compare_exchange_weak (volatile atomic<T>* obj, T* expected, T val) noexcept;template <class T>bool atomic_compare_exchange_weak (atomic<T>* obj, T* expected, T val) noexcept;
overloads (2)
bool atomic_compare_exchange_weak (volatile A* obj, T* expected, T val) noexcept;bool atomic_compare_exchange_weak (A* obj, T* expected, T val) noexcept;
  • 相等,则用 val 替换原子对象的旧值。
  • 不相等,则用原子对象的旧值替换 expected ,因此调用该函数之后,如果被该原子对象封装的值与参数 expected 所指定的值不相等,expected 中的内容就是原子对象的旧值。
template (1)
template <class T>bool atomic_compare_exchange_weak_explicit (volatile atomic<T>* obj,        T* expected, T val, memory_order success, memory_order failure) noexcept;template <class T>bool atomic_compare_exchange_weak_explicit (atomic<T>* obj,        T* expected, T val, memory_order success, memory_order failure) noexcept;
overloads (2)
bool atomic_compare_exchange_weak_explicit (volatile A* obj,        T* expected, T val, memory_order success, memory_order failure) noexcept;bool atomic_compare_exchange_weak_explicit (A* obj,        T* expected, T val, memory_order success, memory_order failure) noexcept;
  • 相等,则用 val 替换原子对象的旧值。
  • 不相等,则用原子对象的旧值替换 expected ,因此调用该函数之后,如果被该原子对象封装的值与参数 expected 所指定的值不相等,expected 中的内容就是原子对象的旧值。
Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_releaseReleasememory_order_acq_relAcquire/Releasememory_order_seq_cstSequentially consistenttemplate (1)
template <class T>bool atomic_compare_exchange_strong (volatile atomic<T>* obj, T* expected, T val) noexcept;template <class T>bool atomic_compare_exchange_strong (atomic<T>* obj, T* expected, T val) noexcept;
overloads (2)
bool atomic_compare_exchange_strong (volatile A* obj, T* expected, T val) noexcept;bool atomic_compare_exchange_strong (A* obj, T* expected, T val) noexcept;
  • 相等,则用 val 替换原子对象的旧值。
  • 不相等,则用原子对象的旧值替换 expected ,因此调用该函数之后,如果被该原子对象封装的值与参数 expected 所指定的值不相等,expected 中的内容就是原子对象的旧值。
template (1)
template <class T>bool atomic_compare_exchange_strong_explicit (volatile atomic<T>* obj,        T* expected, T val, memory_order success, memory_order failure) noexcept;template <class T>bool atomic_compare_exchange_strong_explicit (atomic<T>* obj,        T* expected, T val, memory_order success, memory_order failure) noexcept;
overloads (2)
bool atomic_compare_exchange_strong_explicit (volatile A* obj,        T* expected, T val, memory_order success, memory_order failure) noexcept;bool atomic_compare_exchange_strong_explicit (A* obj,        T* expected, T val, memory_order success, memory_order failure) noexcept;
  • 相等,则用 val 替换原子对象的旧值。
  • 不相等,则用原子对象的旧值替换 expected ,因此调用该函数之后,如果被该原子对象封装的值与参数 expected 所指定的值不相等,expected 中的内容就是原子对象的旧值。
Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_releaseReleasememory_order_acq_relAcquire/Releasememory_order_seq_cstSequentially consistenttemplate (integral) (1)
template <class T> T atomic_fetch_add (volatile atomic<T>* obj, T val) noexcept;template <class T> T atomic_fetch_add (atomic<T>* obj, T val) noexcept;
template (pointer) (2)
template <class U> U* atomic_fetch_add (volatile atomic<U*>* obj, ptrdiff_t val) noexcept;template <class U> U* atomic_fetch_add (atomic<U*>* obj, ptrdiff_t val) noexcept;
overloads (3)
T atomic_fetch_add (volatile A* obj, M val) noexcept;T atomic_fetch_add (A* obj, M val) noexcept;
template (integral) (1)
template <class T>T atomic_fetch_add_explicit (volatile atomic<T>* obj,                             T val, memory_order sync) noexcept;template <class T>T atomic_fetch_add_explicit (atomic<T>* obj,                             T val, memory_order sync) noexcept;
template (pointer) (2)
template <class U>U* atomic_fetch_add_explicit (volatile atomic<U*>* obj,                              ptrdiff_t val, memory_order sync) noexcept;template <class U>U* atomic_fetch_add_explicit (atomic<U*>* obj,                              ptrdiff_t val, memory_order sync) noexcept;
overloads (3)
T atomic_fetch_add_explicit (volatile A* obj, M val, memory_order sync) noexcept;T atomic_fetch_add_explicit (A* obj, M val, memory_order sync) noexcept;
Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_releaseReleasememory_order_acq_relAcquire/Releasememory_order_seq_cstSequentially consistenttemplate (integral) (1)
template <class T> T atomic_fetch_sub (volatile atomic<T>* obj, T val) noexcept;template <class T> T atomic_fetch_sub (atomic<T>* obj, T val) noexcept;
template (pointer) (2)
template <class U> U* atomic_fetch_sub (volatile atomic<U*>* obj, ptrdiff_t val) noexcept;template <class U> U* atomic_fetch_sub (atomic<U*>* obj, ptrdiff_t val) noexcept;
overloads (3)
T atomic_fetch_sub (volatile A* obj, M val) noexcept;T atomic_fetch_sub (A* obj, M val) noexcept;
template (integral) (1)
template <class T>T atomic_fetch_sub_explicit (volatile atomic<T>* obj,                             T val, memory_order sync) noexcept;template <class T>T atomic_fetch_sub_explicit (atomic<T>* obj,                             T val, memory_order sync) noexcept;
template (pointer) (2)
template <class U>U* atomic_fetch_sub_explicit (volatile atomic<U*>* obj,                              ptrdiff_t val, memory_order sync) noexcept;template <class U>U* atomic_fetch_sub_explicit (atomic<U*>* obj,                              ptrdiff_t val, memory_order sync) noexcept;
overloads (3)
T atomic_fetch_sub_explicit (volatile A* obj, M val, memory_order sync) noexcept;T atomic_fetch_sub_explicit (A* obj, M val, memory_order sync) noexcept;
Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_releaseReleasememory_order_acq_relAcquire/Releasememory_order_seq_cstSequentially consistentemplate (integral) (1)
template <class T> T atomic_fetch_and (volatile atomic<T>* obj, T val) noexcept;template <class T> T atomic_fetch_and (atomic<T>* obj, T val) noexcept;
overloads (2)
T atomic_fetch_and (volatile A* obj, T val) noexcept;T atomic_fetch_and (A* obj, T val) noexcept;
template (integral) (1)
template <class T>T atomic_fetch_and_explicit (volatile atomic<T>* obj,                             T val, memory_order sync) noexcept;template <class T>T atomic_fetch_and_explicit (atomic<T>* obj,                             T val, memory_order sync) noexcept;
overloads (2)
T atomic_fetch_and_explicit (volatile A* obj, T val, memory_order sync) noexcept;T atomic_fetch_and_explicit (A* obj, T val, memory_order sync) noexcept;
Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_releaseReleasememory_order_acq_relAcquire/Releasememory_order_seq_cstSequentially consistenttemplate (integral) (1)
template <class T> T atomic_fetch_or (volatile atomic<T>* obj, T val) noexcept;template <class T> T atomic_fetch_or (atomic<T>* obj, T val) noexcept;
overloads (2)
T atomic_fetch_or (volatile A* obj, T val) noexcept;T atomic_fetch_or (A* obj, T val) noexcept;
template (integral) (1)
template <class T>T atomic_fetch_or_explicit (volatile atomic<T>* obj,                             T val, memory_order sync) noexcept;template <class T>T atomic_fetch_or_explicit (atomic<T>* obj,                             T val, memory_order sync) noexcept;
overloads (2)
T atomic_fetch_or_explicit (volatile A* obj, T val, memory_order sync) noexcept;T atomic_fetch_or_explicit (A* obj, T val, memory_order sync) noexcept;
Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_releaseReleasememory_order_acq_relAcquire/Releasememory_order_seq_cstSequentially consistenttemplate (integral) (1)
template <class T> T atomic_fetch_xor (volatile atomic<T>* obj, T val) noexcept;template <class T> T atomic_fetch_xor (atomic<T>* obj, T val) noexcept;
overloads (2)
T atomic_fetch_xor (volatile A* obj, T val) noexcept;T atomic_fetch_xor (A* obj, T val) noexcept;
template (integral) (1)
template <class T>T atomic_fetch_xor_explicit (volatile atomic<T>* obj,                             T val, memory_order sync) noexcept;template <class T>T atomic_fetch_xor_explicit (atomic<T>* obj,                             T val, memory_order sync) noexcept;
overloads (2)
T atomic_fetch_xor_explicit (volatile A* obj, T val, memory_order sync) noexcept;T atomic_fetch_xor_explicit (A* obj, T val, memory_order sync) noexcept;
Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_releaseReleasememory_order_acq_relAcquire/Releasememory_order_seq_cstSequentially consistent

与原子对象初始化相关的宏

3 0