原子型別
std::atomic
模板的每個例項化和完全特化都定義了原子型別。如果一個執行緒寫入原子物件而另一個執行緒從中讀取,則行為是明確定義的(有關資料爭用的詳細資訊,請參閱記憶體模型)
此外,對原子物件的訪問可以建立執行緒間同步並按照 std::memory_order
的規定來命令非原子儲存器訪問。
std::atomic 可以用任何 TriviallyCopyable type T. std::atomic
例項化,既不可複製也不可移動。
標準庫為以下型別提供 std::atomic 模板的特化:
- 定義了
bool
及其 typedef 型別的一個完整特化,它被視為非專用std::atomic<T>
,除了它具有標準佈局,普通預設建構函式,普通解構函式,並支援聚合初始化語法:
Typedef 名稱 | 完全專業化 |
---|---|
std::atomic_bool |
std::atomic<bool> |
2)完整型別的完全特化和 typedef,如下所示:
Typedef 名稱 | 完全專業化 |
---|---|
std::atomic_char |
std::atomic<char> |
std::atomic_char |
std::atomic<char> |
std::atomic_schar |
std::atomic<signed char> |
std::atomic_uchar |
std::atomic<unsigned char> |
std::atomic_short |
std::atomic<short> |
std::atomic_ushort |
std::atomic<unsigned short> |
std::atomic_int |
std::atomic<int> |
std::atomic_uint |
std::atomic<unsigned int> |
std::atomic_long |
std::atomic<long> |
std::atomic_ulong |
std::atomic<unsigned long> |
std::atomic_llong |
std::atomic<long long> |
std::atomic_ullong |
std::atomic<unsigned long long> |
std::atomic_char16_t |
std::atomic<char16_t> |
std::atomic_char32_t |
std::atomic<char32_t> |
std::atomic_wchar_t |
std::atomic<wchar_t> |
std::atomic_int8_t |
std::atomic<std::int8_t> |
std::atomic_uint8_t |
std::atomic<std::uint8_t> |
std::atomic_int16_t |
std::atomic<std::int16_t> |
std::atomic_uint16_t |
std::atomic<std::uint16_t> |
std::atomic_int32_t |
std::atomic<std::int32_t> |
std::atomic_uint32_t |
std::atomic<std::uint32_t> |
std::atomic_int64_t |
std::atomic<std::int64_t> |
std::atomic_uint64_t |
std::atomic<std::uint64_t> |
std::atomic_int_least8_t |
std::atomic<std::int_least8_t> |
std::atomic_uint_least8_t |
std::atomic<std::uint_least8_t> |
std::atomic_int_least16_t |
std::atomic<std::int_least16_t> |
std::atomic_uint_least16_t |
std::atomic<std::uint_least16_t> |
std::atomic_int_least32_t |
std::atomic<std::int_least32_t> |
std::atomic_uint_least32_t |
std::atomic<std::uint_least32_t> |
std::atomic_int_least64_t |
std::atomic<std::int_least64_t> |
std::atomic_uint_least64_t |
std::atomic<std::uint_least64_t> |
std::atomic_int_fast8_t |
std::atomic<std::int_fast8_t> |
std::atomic_uint_fast8_t |
std::atomic<std::uint_fast8_t> |
std::atomic_int_fast16_t |
std::atomic<std::int_fast16_t> |
std::atomic_uint_fast16_t |
std::atomic<std::uint_fast16_t> |
std::atomic_int_fast32_t |
std::atomic<std::int_fast32_t> |
std::atomic_uint_fast32_t |
std::atomic<std::uint_fast32_t> |
std::atomic_int_fast64_t |
std::atomic<std::int_fast64_t> |
std::atomic_uint_fast64_t |
std::atomic<std::uint_fast64_t> |
std::atomic_intptr_t |
std::atomic<std::intptr_t> |
std::atomic_uintptr_t |
std::atomic<std::uintptr_t> |
std::atomic_size_t |
std::atomic<std::size_t> |
std::atomic_ptrdiff_t |
std::atomic<std::ptrdiff_t> |
std::atomic_intmax_t |
std::atomic<std::intmax_t> |
std::atomic_uintmax_t |
std::atomic<std::uintmax_t> |
使用 std::atomic_int 的簡單示例
#include <iostream> // std::cout
#include <atomic> // std::atomic, std::memory_order_relaxed
#include <thread> // std::thread
std::atomic_int foo (0);
void set_foo(int x) {
foo.store(x,std::memory_order_relaxed); // set value atomically
}
void print_foo() {
int x;
do {
x = foo.load(std::memory_order_relaxed); // get value atomically
} while (x==0);
std::cout << "foo: " << x << '\n';
}
int main ()
{
std::thread first (print_foo);
std::thread second (set_foo,10);
first.join();
//second.join();
return 0;
}
//output: foo: 10