0Pricing
C++ Academy · Pelajaran

std::mutex, lock_guard, dan unique_lock

Lindungi keadaan bersama dengan mutex serta pembantu penguncian berbasis RAII

std::mutex, lock_guard, dan unique_lock 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.

Mengapa Muteks?

Beberapa utas yang mengakses data yang sama akan berlomba mendapatkannya. Muteks menjamin akses eksklusif: hanya satu utas yang memegang kunci pada satu waktu.

Dasar-Dasar std::mutex

Buat, kunci, lalu buka kunci. Penguncian manual rentan menimbulkan kesalahan—selalu gunakan pembantu RAII.

#include <mutex>
std::mutex mtx;

mtx.lock();
// critical section
mtx.unlock();

std::lock_guard: Kunci RAII

Kunci RAII yang paling sederhana. Mengunci pada konstruktor dan membuka kunci pada destruktor. Bekerja sempurna untuk bagian kritis yang tidak melempar pengecualian.

std::mutex mtx;
int counter = 0;

void increment() {
    std::lock_guard<std::mutex> lock(mtx);
    ++counter;
}

std::scoped_lock (C++17)

Seperti lock_guard, tetapi dapat mengunci beberapa muteks sekaligus tanpa kebuntuan. Pilih ini dalam kode modern.

#include <mutex>
std::scoped_lock lock(mtx1, mtx2, mtx3);  // locks all atomically

std::unique_lock: Kunci Fleksibel

Memiliki lebih banyak fitur daripada lock_guard:

  • Dapat dibuka kuncinya dan dikunci kembali di tengah cakupan
  • Dapat dipindahkan (kepemilikan dapat dialihkan)
  • Digunakan dengan variabel kondisi
std::unique_lock<std::mutex> lock(mtx);
lock.unlock();        // release temporarily
// ... do something without the lock ...
lock.lock();           // reacquire

Menghindari Kebuntuan

Dua utas dapat mengalami kebuntuan jika memperoleh kunci dalam urutan yang berbeda. Peroleh kunci dalam urutan global yang konsisten, atau gunakan std::scoped_lock dengan beberapa muteks.

std::lock untuk Beberapa Muteks

Sebelum C++17, gunakan std::lock untuk memperoleh beberapa muteks secara atomik. std::scoped_lock dalam C++17 lebih sederhana.

Muteks Rekursif

std::recursive_mutex memungkinkan utas menguncinya beberapa kali. Biasanya ini menandakan masalah desain—lakukan refaktor sebagai gantinya.

try_lock dan timed_mutex

try_lock segera mengembalikan hasil jika kunci sedang dipegang. std::timed_mutex mendukung percobaan penguncian berbatas waktu.

Kunci Pembaca-Penulis

std::shared_mutex (C++17) memungkinkan banyak pembaca secara bersamaan atau satu penulis eksklusif. Gunakan untuk beban kerja yang didominasi pembacaan.

std::shared_mutex sm;
void read()  { std::shared_lock lk(sm);   /* read */ }
void write() { std::unique_lock lk(sm);   /* write */ }

Kompromi Granularitas

Penguncian yang terlalu kasar mengurangi konkurensi. Penguncian yang terlalu rinci menambah overhead. Ukur performa dan sesuaikan.

Alternatif Tanpa Penguncian

Untuk skenario dengan persaingan tinggi, pertimbangkan struktur data tanpa penguncian (operasi atomik, antrean tanpa penguncian). Jauh lebih sulit ditulis dengan benar—gunakan hanya jika diperlukan dan telah diverifikasi.

Pemeriksaan Singkat

Kunci RAII mana yang sebaiknya Anda pilih saat mengunci beberapa muteks sekaligus?

Ringkasan

Gunakan std::lock_guard untuk bagian kritis sederhana, std::scoped_lock untuk beberapa muteks, dan std::unique_lock saat Anda memerlukan fleksibilitas (variabel kondisi, pembukaan kunci manual). Selalu gunakan RAII—jangan pernah mengunci atau membuka kunci secara manual.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “std::mutex, lock_guard, dan unique_lock” gratis?

Ya — teks lengkap “std::mutex, lock_guard, dan unique_lock” 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::mutex, lock_guard, dan unique_lock”?

Lindungi keadaan bersama dengan mutex serta pembantu penguncian berbasis RAII 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 “std::mutex, lock_guard, dan unique_lock” 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::thread: Menggabungkan dan Melepaskan
  2. std::mutex, lock_guard, dan unique_lock
  3. Variabel Kondisi dan Pola Pekerja
  4. Dasar std::async dan std::future
← Kembali ke C++ Academy