CodeBlanks Logo Icon CodeBlanks

std::mutex

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

main.cpp
#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

main.cpp
#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

Soru
std::mutex m;
void add_once() {
    m.____;
    counter++;
    m.unlock();
}
Cevap
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

İleri seviye bölümündeki tüm dersler