std::mutex
- C++ kursu
- İleri seviye
- Ders 20/83
- 5 dk
std::mutex ile karşılıklı dışlama öğrenirsin.
std::mutex
std::mutex, paylaşılan veriyi koruyan karşılıklı dışlama (mutual exclusion) aracıdır. m.lock(); kilidi alır; aynı anda yalnızca bir iş parçacığı kilitli bölgeye girer. m.unlock(); kilidi bırakır ve başka bir iş parçacığının girmesine izin verir.
Birden fazla iş parçacığı aynı counter++ kodunu aynı anda çalıştırırsa veri yarışı oluşur. Mutex, bu bölgeyi kritik bölüm haline getirir ve sıralı erişim sağlar. Mutex unutulursa kilit açılmaz; bu yüzden modern C++ std::lock_guard kullanır. Mutex kilidi elindeyken aynı iş parçacığı tekrar lock çağırırsa kilitlenme (deadlock) oluşur.
Kritik bölüm
Kritik bölüm, aynı anda yalnızca bir iş parçacığının girebileceği kod bloğudur. Mutex ile korunur: m.lock(); /* kritik */ m.unlock();. Bu blok içinde paylaşılan veri güvenle değiştirilebilir.
Kritik bölüm ne kadar kısa olursa, iş parçacıkları o kadar az bekler. Uzun işlemler kritik bölümde yapılmamalıdır; bunun yerine veri kopyalanıp bölüm dışında işlenir. Mutex, bir iş parçacığının kilidi unutarak bırakmaması için RAII sarmalayıcılarla kullanılır; bu sarmalayıcı bir sonraki dersin konusudur.
Uygulama Mutex ile counter
Global int counter = 0; ve std::mutex m; tanımla. void add_once() yaz; gövdede m.lock(); counter++; m.unlock(); olsun. main içinde iki iş parçacığı başlat (t1 ve t2), her ikisini de join ile bekle, sonra std::cout << counter; yaz.
Başlangıç kodu
#include <iostream>
#include <thread>
#include <mutex>
int counter = 0;
std::mutex m;
// add_once fonksiyonunu yaz
int main() {
// İki iş parçacığı başlat, bekle, yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <thread>
#include <mutex>
int counter = 0;
std::mutex m;
void add_once() {
m.lock();
counter++;
m.unlock();
}
int main() {
std::thread t1(add_once);
std::thread t2(add_once);
t1.join();
t2.join();
std::cout << counter;
return 0;
}Beklenen çıktı
2
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 lock satırını tamamla
std::mutex m;
void add_once() {
m.____;
counter++;
m.unlock();
}
std::mutex m;
void add_once() {
m.lock;
counter++;
m.unlock();
}
Açıklama: m.lock(); yazılır. Kilit almak için lock üye işlevi çağrılır.
2 Mutex neyi korur?
- Yerel değişkenleri
- Bellek boyutunu
- İş parçacığı sayısını
- Paylaşılan veriyi Doğru cevap
Açıklama: Mutex, paylaşılan veriyi korur.
3 İfadeyi rolüne eşle
| Kavram | Anlamı |
|---|---|
m.lock() |
Kilidi al |
m.unlock() |
Kilidi bırak |
std::mutex m |
Mutex tanımı |
counter++ |
Korunacak işlem |