0Pricing
C++ Academy · Pelajaran

Pola Compare-and-Swap CAS

Implementasikan pembaruan tanpa kunci dengan compare_exchange_weak dan compare_exchange_strong

Pola Compare-and-Swap CAS adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.

Primitif CAS

Bandingkan dan tukar membaca, membandingkan, dan menulis secara atomik dan bersyarat. Ini merupakan dasar bagi sebagian besar algoritme tanpa kunci.

Compare Exchange dalam C++

Dua varian dalam std::atomic:

  • compare_exchange_strong(expected, desired) — berhasil ketika nilai saat ini sama dengan expected
  • compare_exchange_weak(expected, desired) — dapat gagal secara semu

Anatomi Perulangan CAS

Perulangan CAS klasik: baca, hitung, lalu coba tulis. Ulangi jika utas lain memenangkan persaingan.

std::atomic<int> a{0};

int old = a.load();
int next;
do {
    next = compute_new(old);
} while (!a.compare_exchange_weak(old, next));

CAS untuk Pembaruan Atomik

Gunakan CAS ketika nilai baru bergantung pada nilai lama. store biasa akan kehilangan pembaruan dari utas yang berjalan bersamaan.

// Atomic max
int current = a.load();
while (newval > current && !a.compare_exchange_weak(current, newval));

Tumpukan Tanpa Kunci: Push

Operasi push pada tumpukan sederhana tanpa kunci menggunakan CAS untuk memasang simpul baru di bagian kepala.

struct Node { int value; Node* next; };
std::atomic<Node*> head{nullptr};

void push(int v) {
    Node* n = new Node{v, nullptr};
    n->next = head.load();
    while (!head.compare_exchange_weak(n->next, n));
}

Kegagalan Semu

compare_exchange_weak dapat gagal meskipun nilainya cocok — pada platform seperti ARM, ketika instruksi dasarnya diizinkan untuk gagal. Gunakan di dalam perulangan; gunakan strong ketika pengulangan kembali membutuhkan biaya besar.

Pola Pembaruan: Reset

Untuk mengatur ulang nilai ke keadaan yang diketahui hanya jika nilai tersebut belum berubah.

int expected = 42;
if (a.compare_exchange_strong(expected, 0)) {
    // a was 42 and is now 0
}

Blok Pembangun: Penghitung Atomik

Untuk penghitung biasa, fetch_add lebih sederhana dan lebih cepat daripada perulangan CAS.

Blok Pembangun: Penanda Atomik

Untuk penanda boolean sederhana, std::atomic_flag lebih ringan daripada std::atomic<bool> dan mendukung test_and_set.

Menalar tentang Konkruensi

Kode tanpa kunci terkenal sulit untuk dipahami. Gunakan pengujian yang ketat (TSan, fuzzing), model formal jika tersedia, dan utamakan implementasi yang sudah teruji dalam berbagai penggunaan.

Kapan Memilih CAS

Gunakan CAS ketika:

  • Beberapa utas sering memperbarui nilai yang sama
  • Mutex menunjukkan persaingan sebagai hambatan kinerja
  • Bagian kritis sangat singkat dan sederhana

Kapan Tidak Menggunakan CAS

Hindari CAS ketika:

  • Pembaruan memerlukan lebih dari beberapa operasi
  • Kebenaran lebih penting daripada kapasitas pemrosesan
  • Tim tidak memiliki keahlian dalam pemrograman tanpa kunci

Pemeriksaan Singkat

Mengapa kita biasanya menggunakan compare_exchange_weak di dalam perulangan?

Ringkasan

Bandingkan dan tukar memperbarui nilai secara atomik hanya jika nilainya sama dengan nilai yang diharapkan. Perulangan CAS menangani pembaruan bersamaan tanpa kunci. Gunakan compare_exchange_weak di dalam perulangan dan strong untuk percobaan satu kali.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pola Compare-and-Swap CAS” gratis?

Ya — teks lengkap “Pola Compare-and-Swap CAS” 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 “Pola Compare-and-Swap CAS”?

Implementasikan pembaruan tanpa kunci dengan compare_exchange_weak dan compare_exchange_strong 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 2 dari 4.

Berapa lama pelajaran “Pola Compare-and-Swap CAS” 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

  1. std::atomic dan Urutan Memori
  2. Pola Compare-and-Swap CAS
  3. Implementasi Antrean Tanpa Kunci
  4. Pointer Bahaya dan Masalah ABA
← Kembali ke C++ Academy