std::mutex, lock_guard ve unique_lock
Paylaşılan durumu mutex'lerle ve RAII tabanlı kilit yardımcılarıyla koruyun
std::mutex, lock_guard ve unique_lock, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.
Karşılıklı Dışlama Kilidi Neden Gerekli?
Aynı verilere erişen birden çok iş parçacığı bunlar için yarışır. Bir karşılıklı dışlama kilidi, karşılıklı dışlamayı garanti eder: aynı anda yalnızca bir iş parçacığı kilidi tutar.
std::mutex Temelleri
Oluşturun, lock ve unlock işlemlerini yapın. El ile kilitleme hataya açıktır; her zaman RAII yardımcılarını kullanın.
#include <mutex>
std::mutex mtx;
mtx.lock();
// critical section
mtx.unlock();std::lock_guard: RAII Kilidi
En basit RAII kilididir. Yapıcıda kilitler, yıkıcıda kilidi açar. Hata fırlatmayan kritik bölümler için mükemmeldir.
std::mutex mtx;
int counter = 0;
void increment() {
std::lock_guard<std::mutex> lock(mtx);
++counter;
}std::scoped_lock (C++17)
lock_guard gibidir, ancak kilitlenmeye yol açmadan birden çok karşılıklı dışlama kilidini aynı anda alabilir. Modern kodda bunu tercih edin.
#include <mutex>
std::scoped_lock lock(mtx1, mtx2, mtx3); // locks all atomicallystd::unique_lock: Esnek Kilit
lock_guard'dan daha fazla özelliğe sahiptir:
- Kapsamın ortasında kilidi açıp yeniden kilitleyebilirsiniz
- Taşınabilir (sahiplik aktarılabilir)
- Koşul değişkenleriyle birlikte kullanılabilir
std::unique_lock<std::mutex> lock(mtx);
lock.unlock(); // release temporarily
// ... do something without the lock ...
lock.lock(); // reacquireKilitlenmeyi Önleme
İki iş parçacığı kilitleri farklı sırayla alırsa kilitlenebilir. Kilitleri tutarlı bir genel sırayla alın veya birden çok karşılıklı dışlama kilidiyle std::scoped_lock kullanın.
Birden Çok Karşılıklı Dışlama Kilidi için std::lock
C++17 öncesinde birkaç karşılıklı dışlama kilidini atomik olarak almak için std::lock kullanın. C++17'deki std::scoped_lock daha temiz bir çözümdür.
Özyinelemeli Karşılıklı Dışlama Kilidi
std::recursive_mutex, bir iş parçacığının kilidi birden çok kez almasına izin verir. Bu genellikle tasarım sorunlarına işaret eder; bunun yerine kodu yeniden düzenleyin.
try_lock ve timed_mutex
try_lock, kilit tutuluyorsa hemen döner. std::timed_mutex, süre sınırlı kilitleme denemelerini destekler.
Okuyucu-Yazıcı Kilidi
std::shared_mutex (C++17), birçok eşzamanlı okuyucuya veya tek bir özel yazıcıya izin verir. Okuma ağırlıklı iş yüklerinde kullanın.
std::shared_mutex sm;
void read() { std::shared_lock lk(sm); /* read */ }
void write() { std::unique_lock lk(sm); /* write */ }Kilit Ayrıntı Düzeyi Dengesi
Kilitleri çok geniş kapsamlı almak eşzamanlılığı azaltır. Çok dar kapsamlı almak ise ek yük oluşturur. Profil oluşturun ve ayarlayın.
Kilitsiz Alternatifler
Çok yoğun çekişme yaşanan senaryolarda kilitsiz veri yapılarını (atomik yapılar, kilitsiz kuyruklar) değerlendirin. Bunları doğru yazmak çok daha zordur; yalnızca gerektiğinde ve doğrulandığında kullanın.
Kısa Kontrol
Birden çok karşılıklı dışlama kilidini aynı anda alırken hangi RAII kilidini tercih etmelisiniz?
Özet
Basit kritik bölümler için std::lock_guard, birden çok karşılıklı dışlama kilidi için std::scoped_lock ve esnekliğe (koşul değişkenleri, el ile kilit açma) ihtiyaç duyduğunuzda std::unique_lock kullanın. Her zaman RAII kullanın; lock/unlock çağrılarını el ile asla yapmayın.
Sıkça Sorulan Sorular
“std::mutex, lock_guard ve unique_lock” dersi ücretsiz mi?
Evet — “std::mutex, lock_guard ve unique_lock” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.
“std::mutex, lock_guard ve unique_lock” dersinde ne öğreneceğim?
Paylaşılan durumu mutex'lerle ve RAII tabanlı kilit yardımcılarıyla koruyun C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C++ Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“std::mutex, lock_guard ve unique_lock” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- std::thread Birleştirme ve Ayırma
- std::mutex, lock_guard ve unique_lock
- Koşul Değişkenleri ve İşçi Kalıpları
- std::async ve std::future Temelleri