Bagikan melalui


<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.

Lihat juga

Referensi File Header
Referensi pustaka standar C++