<atomic>
Menentukan kelas dan templat kelas yang akan digunakan untuk membuat jenis yang mendukung operasi atomik.
Sintaks
#include <atomic>
Keterangan
Catatan
Dalam kode yang dikompilasi dengan menggunakan /clr:pure
, header ini diblokir. Keduanya /clr:pure
dan /clr:safe
tidak digunakan lagi di Visual Studio 2017 dan versi yang lebih baru.
Operasi atom memiliki dua properti utama yang membantu Anda menggunakan beberapa utas untuk memanipulasi objek dengan benar tanpa menggunakan mutex
kunci.
Karena operasi atom tidak dapat dibaca, operasi atom kedua pada objek yang sama dari utas yang berbeda dapat memperoleh status objek hanya sebelum atau setelah operasi atom pertama.
Berdasarkan argumennya
memory_order
, operasi atom menetapkan persyaratan pemesanan untuk visibilitas efek operasi atom lainnya dalam utas yang sama. Akibatnya, ini menghambat pengoptimalan pengkompilasi yang melanggar persyaratan pemesanan.
Pada beberapa platform, mungkin tidak mungkin untuk menerapkan operasi atom secara efisien untuk beberapa jenis tanpa menggunakan mutex
kunci. Jenis atom adalah lock-free
jika tidak ada operasi atom pada jenis tersebut yang menggunakan kunci.
C++11
: Dalam penangan sinyal, Anda dapat melakukan operasi atom pada objek obj
jika obj.is_lock_free()
atau atomic_is_lock_free(x)
adalah true
.
atomic_flag
Kelas ini menyediakan jenis atom minimal yang menyimpan bool
bendera. Operasinya selalu bebas kunci.
Templat atomic<T>
kelas menyimpan objek dari jenis T
argumennya dan menyediakan akses atomik ke nilai tersimpan tersebut. Anda dapat membuat instansnya dengan menggunakan jenis apa pun yang dapat disalin dengan menggunakan memcpy
dan diuji untuk kesetaraan dengan menggunakan memcmp
. Secara khusus, Anda dapat menggunakannya dengan jenis yang ditentukan pengguna yang memenuhi persyaratan ini dan, dalam banyak kasus, dengan jenis floating-point.
Templat ini juga memiliki serangkaian spesialisasi untuk jenis integral dan spesialisasi parsial untuk penunjuk. Spesialisasi ini menyediakan operasi tambahan yang tidak tersedia melalui templat utama.
Spesialisasi Pointer
Spesialisasi atomic<T *>
parsial berlaku untuk semua jenis penunjuk. Mereka menyediakan metode untuk aritmatika pointer.
Spesialisasi Integral
Spesialisasi atomic<integral>
berlaku untuk semua jenis integral. Mereka menyediakan operasi tambahan yang tidak tersedia melalui templat utama.
Setiap atomic<integral>
jenis memiliki makro terkait yang dapat Anda gunakan dalam untuk if directive
menentukan pada waktu kompilasi apakah operasi pada jenis tersebut bebas kunci. Jika nilai makro adalah nol, operasi pada jenis tidak bebas kunci. Jika nilainya adalah 1, operasi mungkin bebas kunci, dan pemeriksaan runtime diperlukan. Jika nilainya adalah 2, operasi bebas kunci. Anda dapat menggunakan fungsi atomic_is_lock_free
untuk menentukan pada runtime apakah operasi pada jenis bebas kunci.
Untuk setiap jenis integral, ada jenis atom bernama yang sesuai yang mengelola objek dari jenis integral tersebut. Setiap atomic_integral
jenis memiliki sekumpulan fungsi anggota yang sama dengan instansiasi atomic<T>
yang sesuai dan dapat diteruskan ke salah satu fungsi atom non-anggota.
atomic_integral Jenis |
Tipe Integral | atomic_is_lock_free Makro |
---|---|---|
atomic_char |
char |
ATOMIC_CHAR_LOCK_FREE |
atomic_schar |
signed char |
ATOMIC_CHAR_LOCK_FREE |
atomic_uchar |
unsigned char |
ATOMIC_CHAR_LOCK_FREE |
atomic_char16_t |
char16_t |
ATOMIC_CHAR16_T_LOCK_FREE |
atomic_char32_t |
char32_t |
ATOMIC_CHAR32_T_LOCK_FREE |
atomic_wchar_t |
wchar_t |
ATOMIC_WCHAR_T_LOCK_FREE |
atomic_short |
short |
ATOMIC_SHORT_LOCK_FREE |
atomic_ushort |
unsigned short |
ATOMIC_SHORT_LOCK_FREE |
atomic_int |
int |
ATOMIC_INT_LOCK_FREE |
atomic_uint |
unsigned int |
ATOMIC_INT_LOCK_FREE |
atomic_long |
long |
ATOMIC_LONG_LOCK_FREE |
atomic_ulong |
unsigned long |
ATOMIC_LONG_LOCK_FREE |
atomic_llong |
long long |
ATOMIC_LLONG_LOCK_FREE |
atomic_ullong |
unsigned long long |
ATOMIC_LLONG_LOCK_FREE |
Typedef
nama ada untuk spesialisasi templat atom untuk beberapa jenis yang ditentukan di header <inttypes.h>
.
Jenis Atom | Typedef Nama |
---|---|
atomic_int8_t |
atomic<int8_t> |
atomic_uint8_t |
atomic<uint8_t> |
atomic_int16_t |
atomic<int16_t> |
atomic_uint16_t |
atomic<uint16_t> |
atomic_int32_t |
atomic<int32_t> |
atomic_uint32_t |
atomic<uint32_t> |
atomic_int64_t |
atomic<int64_t> |
atomic_uint64_t |
atomic<uint64_t> |
atomic_int_least8_t |
atomic<int_least8_t> |
atomic_uint_least8_t |
atomic<uint_least8_t> |
atomic_int_least16_t |
atomic<int_least16_t> |
atomic_uint_least16_t |
atomic<uint_least16_t> |
atomic_int_least32_t |
atomic<int_least32_t> |
atomic_uint_least32_t |
atomic<uint_least32_t> |
atomic_int_least64_t |
atomic<int_least64_t> |
atomic_uint_least64_t |
atomic<uint_least64_t> |
atomic_int_fast8_t |
atomic<int_fast8_t> |
atomic_uint_fast8_t |
atomic<uint_fast8_t> |
atomic_int_fast16_t |
atomic<int_fast16_t> |
atomic_uint_fast16_ |
atomic<uint_fast16_t> |
atomic_int_fast32_t |
atomic<int_fast32_t> |
atomic_uint_fast32_t |
atomic<uint_fast32_t> |
atomic_int_fast64_t |
atomic<int_fast64_t> |
atomic_uint_fast64_t |
atomic<uint_fast64_t> |
atomic_intptr_t |
atomic<intptr_t> |
atomic_uintptr_t |
atomic<uintptr_t> |
atomic_size_t |
atomic<size_t> |
atomic_ptrdiff_t |
atomic<ptrdiff_t> |
atomic_intmax_t |
atomic<intmax_t> |
atomic_uintmax_t |
atomic<uintmax_t> |
Structs
Nama | Deskripsi |
---|---|
atomic Struktur |
Menjelaskan objek yang melakukan atomic operasi pada nilai tersimpan. |
atomic_flag Struktur |
Menjelaskan objek yang secara atomik mengatur dan menghapus bool bendera. |
Enums
Nama | Deskripsi |
---|---|
memory_order Enum |
Menyediakan nama simbolis untuk operasi sinkronisasi pada lokasi memori. Operasi ini memengaruhi bagaimana penugasan dalam satu utas menjadi terlihat di utas lain. |
Fungsi
Dalam daftar berikut, fungsi yang tidak berakhir _explicit
memiliki semantik yang sesuai _explicit
, kecuali bahwa fungsi tersebut memiliki argumen implisit memory_order
dari memory_order_seq_cst
.
Nama | Deskripsi |
---|---|
atomic_compare_exchange_strong |
atomic compare and exchange Melakukan operasi. |
atomic_compare_exchange_strong_explicit |
atomic compare and exchange Melakukan operasi. |
atomic_compare_exchange_weak |
weak atomic compare and exchange Melakukan operasi. |
atomic_compare_exchange_weak_explicit |
weak atomic compare and exchange Melakukan operasi. |
atomic_exchange |
Menggantikan nilai tersimpan. |
atomic_exchange_explicit |
Menggantikan nilai tersimpan. |
atomic_fetch_add |
Menambahkan nilai tertentu ke nilai tersimpan yang sudah ada. |
atomic_fetch_add_explicit |
Menambahkan nilai tertentu ke nilai tersimpan yang sudah ada. |
atomic_fetch_and |
Melakukan bitwise "dan" (& ) pada nilai tertentu dan nilai tersimpan yang ada. |
atomic_fetch_and_explicit |
Melakukan bitwise "dan" (& ) pada nilai tertentu dan nilai tersimpan yang ada. |
atomic_fetch_or |
Melakukan bitwise "atau" (| ) pada nilai tertentu dan nilai tersimpan yang ada. |
atomic_fetch_or_explicit |
Melakukan bitwise "atau" (| ) pada nilai tertentu dan nilai tersimpan yang ada. |
atomic_fetch_sub |
Mengurangi nilai tertentu dari nilai tersimpan yang ada. |
atomic_fetch_sub_explicit |
Mengurangi nilai tertentu dari nilai tersimpan yang ada. |
atomic_fetch_xor |
Melakukan bitwise "eksklusif atau" (^ ) pada nilai tertentu dan nilai tersimpan yang ada. |
atomic_fetch_xor_explicit |
Melakukan bitwise "eksklusif atau" (^ ) pada nilai tertentu dan nilai tersimpan yang ada. |
atomic_flag_clear |
Mengatur bendera dalam atomic_flag objek ke false . |
atomic_flag_clear_explicit |
Mengatur bendera dalam atomic_flag objek ke false . |
atomic_flag_test_and_set |
Mengatur bendera dalam atomic_flag objek ke true . |
atomic_flag_test_and_set_explicit |
Mengatur bendera dalam atomic_flag objek ke true . |
atomic_init |
Mengatur nilai tersimpan atomic dalam objek. |
atomic_is_lock_free |
Menentukan apakah operasi atom pada objek tertentu bebas kunci. |
atomic_load |
Secara atomik mengambil nilai. |
atomic_load_explicit |
Secara atomik mengambil nilai. |
atomic_signal_fence |
Bertindak sebagai fence yang menetapkan persyaratan pengurutan memori antara pagar dalam utas panggilan yang memiliki penangan sinyal yang dijalankan dalam utas yang sama. |
atomic_store |
Secara atomik menyimpan nilai. |
atomic_store_explicit |
Secara atomik menyimpan nilai. |
atomic_thread_fence |
Bertindak sebagai fence yang menetapkan persyaratan pemesanan memori sehubungan dengan pagar lain. |
kill_dependency |
Memutus kemungkinan rantai dependensi. |