std::mutex, lock_guard dan unique_lock
Lindungi keadaan dikongsi dengan mutex dan pembantu kunci berasaskan RAII.
std::mutex, lock_guard dan unique_lock ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Mengapa Mutex?
Berbilang benang yang mengakses data yang sama akan bersaing untuk menggunakannya. Mutex menjamin eksklusi bersama: hanya satu benang memegang kunci pada satu-satu masa.
Asas std::mutex
Bina, kunci dan buka kunci. Penguncian manual mudah menyebabkan ralat — sentiasa gunakan pembantu RAII.
#include <mutex>
std::mutex mtx;
mtx.lock();
// critical section
mtx.unlock();std::lock_guard: Kunci RAII
Kunci RAII yang paling ringkas. Mengunci dalam pembina dan membuka kunci dalam pemusnah. Ia berfungsi dengan sempurna untuk bahagian kritikal yang tidak melontarkan 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 boleh mengunci berbilang mutex serentak tanpa kebuntuan. Utamakannya dalam kod moden.
#include <mutex>
std::scoped_lock lock(mtx1, mtx2, mtx3); // locks all atomicallystd::unique_lock: Kunci Fleksibel
Lebih banyak ciri berbanding lock_guard:
- Boleh dibuka kunci dan dikunci semula di tengah skop
- Boleh dipindahkan (pemilikan boleh dipindahkan)
- Digunakan dengan pemboleh ubah syarat
std::unique_lock<std::mutex> lock(mtx);
lock.unlock(); // release temporarily
// ... do something without the lock ...
lock.lock(); // reacquireMengelakkan Kebuntuan
Dua benang boleh mengalami kebuntuan jika memperoleh kunci dalam susunan yang berbeza. Dapatkan kunci mengikut susunan global yang konsisten, atau gunakan std::scoped_lock dengan berbilang mutex.
std::lock untuk Berbilang Mutex
Sebelum C++17, gunakan std::lock untuk memperoleh beberapa mutex secara atom. std::scoped_lock dalam C++17 lebih kemas.
Mutex Rekursif
std::recursive_mutex membolehkan satu benang menguncinya berbilang kali. Biasanya ini menandakan masalah reka bentuk — lakukan pemfaktoran semula.
try_lock dan timed_mutex
try_lock memulangkan hasil serta-merta jika kunci sedang dipegang. std::timed_mutex menyokong percubaan penguncian yang dihadkan masa.
Kunci Pembaca-Penulis
std::shared_mutex (C++17) membolehkan ramai pembaca serentak atau seorang penulis eksklusif. Gunakannya untuk beban kerja yang banyak membaca.
std::shared_mutex sm;
void read() { std::shared_lock lk(sm); /* read */ }
void write() { std::unique_lock lk(sm); /* write */ }Pertukaran Tahap Penguncian
Penguncian yang terlalu kasar menjejaskan keserentakan. Penguncian yang terlalu terperinci menambah overhed. Ukur prestasi dan laraskan.
Alternatif Tanpa Kunci
Untuk senario dengan persaingan tinggi, pertimbangkan struktur data tanpa kunci (atomik, baris gilir tanpa kunci). Struktur ini jauh lebih sukar ditulis dengan betul — gunakannya hanya apabila diperlukan dan telah disahkan.
Semakan Pantas
Kunci RAII manakah yang patut anda utamakan apabila mengunci berbilang mutex serentak?
Imbas Kembali
Gunakan std::lock_guard untuk bahagian kritikal yang ringkas, std::scoped_lock untuk berbilang mutex dan std::unique_lock apabila anda memerlukan fleksibiliti (pemboleh ubah syarat, membuka kunci secara manual). Sentiasa gunakan RAII — jangan panggil lock/unlock secara manual.
Pelajari C++ dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “std::mutex, lock_guard dan unique_lock” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “std::mutex, lock_guard dan unique_lock”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “std::mutex, lock_guard dan unique_lock”?
Lindungi keadaan dikongsi dengan mutex dan pembantu kunci berasaskan RAII. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “std::mutex, lock_guard dan unique_lock” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Penyertaan dan Pemisahan std::thread
- std::mutex, lock_guard dan unique_lock
- Pemboleh Ubah Keadaan dan Corak Pekerja
- Asas std::async dan std::future