std::atomic dan Urutan Memori
Gunakan std::atomic dengan urutan memori yang tepat untuk kebenaran dan kecepatan
std::atomic dan Urutan Memori adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Melampaui Mutex
Kunci membuat akses berjalan secara serial — sederhana dan benar, tetapi membatasi kapasitas pemrosesan. std::atomic menyediakan blok pembangun tanpa kunci untuk kode konkuren berkapasitas tinggi.
Dasar-Dasar std::atomic
std::atomic<T> membungkus sebuah nilai dan mendukung operasi baca-ubah-tulis atomik.
#include <atomic>
std::atomic<int> counter{0};
counter.fetch_add(1); // atomic increment
int v = counter.load();
counter.store(0);Operator Praktis
Untuk tipe aritmetika, operator biasa bersifat atomik.
std::atomic<int> n{0};
++n; // atomic increment
n += 5; // atomic add
int v = n; // atomic loadMengapa Atomik Itu Rumit
CPU dapat mengurutkan ulang operasi memori di antara inti. Urutan memori menentukan pengurutan ulang yang diizinkan.
Urutan Memori
Lima urutan umum:
memory_order_relaxed— atomik, tetapi tanpa pengurutanmemory_order_acquire— dipasangkan dengan release; tidak ada pengurutan ulang setelahnyamemory_order_release— dipasangkan dengan acquire; tidak ada pengurutan ulang sebelumnyamemory_order_acq_rel— keduanyamemory_order_seq_cst— konsisten secara berurutan (bawaan)
Konsistensi Berurutan: Bawaan yang Aman
seq_cst bawaan berperilaku secara intuitif — semua operasi atomik tampak berjalan dalam satu urutan global. Lebih lambat daripada urutan relaxed, tetapi lebih mudah dipahami.
Pemasangan Acquire-Release
Gunakan release pada produsen dan acquire pada konsumen. Setelah acquire, semua penulisan yang terjadi sebelum release yang cocok akan terlihat.
std::atomic<bool> ready{false};
int data = 0;
// producer
data = 42;
ready.store(true, std::memory_order_release);
// consumer
while (!ready.load(std::memory_order_acquire));
std::cout << data; // sees 42Urutan Relaxed
Atomik relaxed menjamin keatomikan (tidak ada pembacaan yang terbelah), tetapi mengizinkan pengurutan ulang apa pun. Gunakan untuk penghitung sederhana ketika urutan tidak penting.
Bandingkan dan Tukar
Dasar bagi sebagian besar algoritme tanpa kunci. compare_exchange_strong(expected, desired) hanya memperbarui secara atomik jika nilai saat ini sama dengan expected.
std::atomic<int> a{10};
int expected = 10;
bool ok = a.compare_exchange_strong(expected, 20);
// if true, a is now 20; otherwise expected holds the actual current valueCAS Lemah vs Kuat
compare_exchange_weak dapat gagal secara semu meskipun nilainya cocok. Gunakan di dalam perulangan (lebih murah pada beberapa platform); gunakan yang kuat di luar perulangan.
Tanpa Kunci vs Tanpa Tunggu
Dua jaminan kemajuan:
- Tanpa kunci — setidaknya satu utas mengalami kemajuan kapan pun
- Tanpa tunggu — setiap utas mengalami kemajuan dalam waktu yang terbatas
Kapan Menggunakan Atomik
Atomik tidak selalu lebih cepat daripada mutex. Gunakan ketika Anda dapat menjaga jalur kritis tetap sederhana — penghitung, penanda, dan keadaan sederhana. Untuk keadaan bersama yang kompleks, mutex biasanya lebih aman dan lebih jelas.
Pemeriksaan Singkat
Urutan memori mana yang memiliki jaminan terkuat, tetapi juga paling lambat?
Ringkasan
std::atomic menyediakan primitif tanpa kunci dengan pengurutan memori yang eksplisit. Gunakan memory_order_seq_cst sebagai bawaan; gunakan pasangan acquire/release untuk pola produsen-konsumen; gunakan relaxed hanya untuk operasi atomik tanpa pengurutan, seperti penghitung.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “std::atomic dan Urutan Memori” gratis?
Ya — teks lengkap “std::atomic dan Urutan Memori” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “std::atomic dan Urutan Memori”?
Gunakan std::atomic dengan urutan memori yang tepat untuk kebenaran dan kecepatan Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “std::atomic dan Urutan Memori” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- std::atomic dan Urutan Memori
- Pola Compare-and-Swap CAS
- Implementasi Antrean Tanpa Kunci
- Pointer Bahaya dan Masalah ABA