Ana içeriğe geç

Mutex

Karşılıklı Dışlama (Mutual Exclusion)

Okunuşu
myuteks
Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/mutex

Kısaca

Mutex, kodun kritik bir bölümüne aynı anda yalnızca bir thread'in girmesine izin veren bir kilittir; thread'ler paylaşılan veriyi aynı anda değiştirip bozamaz.

Mutex nedir?

Mutual exclusion'ın (karşılıklı dışlama) kısaltması olan mutex, paylaşılan verinin aynı anda birkaç thread tarafından kullanılmasını önleyen bir senkronizasyon aracıdır. Bir thread veriye dokunmadan önce mutex'i kilitler (acquire) ve sonra kilidi açar (release). Başka bir thread mutex'i zaten tutuyorsa çağıran, serbest bırakılana kadar bekler. Kilitleme ile kilit açma arasındaki koda kritik bölüm (critical section) denir.

Arka planda mutex, kilidi güvenle almak için compare-and-swap gibi atomik CPU komutlarını, ayrıca bekleyen thread'lerin dönüp CPU zamanı yakmak yerine uyutulması için işletim sisteminin yardımını kullanır. Mutex'in bir sahibi vardır: yalnızca onu kilitleyen thread kilidi açmalıdır. Çoğu dil bir tane sağlar; Python'da threading.Lock, C++'ta std::mutex, Go'da sync.Mutex ve Rust'ta verinin kendisini sarmalayan ve kilitlemeden erişilemeyen Mutex<T> gibi.

Mutex, bir kafenin tuvaletinin tek anahtarı gibidir: anahtarı alan içeri girer ve herkes anahtar geri gelene kadar sırada bekler. Mutex'ler paylaşılan sayaçları, bellek içi önbellekleri, açık bağlantı listelerini ve aynı dosyaya yazmaları korur.

Mutex çoğu zaman semaphore ile karıştırılır. Mutex tam olarak bir tutucuya izin verir ve bir sahibi vardır; semaphore ise aynı anda birkaç thread'i içeri alabilen ve herhangi bir thread tarafından serbest bırakılabilen bir sayaçtır. İlgili hataları ayrı tutmak da yardımcı olur: yarış durumu (race condition) mutex'in önlediği hatadır, deadlock ise dikkatsiz mutex kullanımının yol açabileceği hatadır; iki thread'in her biri bir mutex tuttuğunda ve sonsuza dek diğerinin mutex'ini beklediğinde ortaya çıkar. Kritik bölümleri kısa tutun ve kilidi with, defer veya kapsamlı koruyucular (scoped guard) gibi yapılarla otomatik olarak serbest bırakın.

Bir bakışta

İki thread, bir mutex ile korunan 100 tutarındaki bir bakiyeyi paylaşır. Thread A kilidi alır ve 50 ekler; bu sırada kilidi isteyen thread B bekler; A kilidi bırakınca B kilidi alır ve 20 çıkarır. Sırayla yapıldığı için bakiye olması gerektiği gibi 130 olur.bakiye: 100 → 150 → 130Thread AMutexThread Block()unlock()balance += 50kritik bölümboştaA'daB'deboştakilidi bekliyorbalance -= 20kritik bölümlock()unlock()zaman
Kritik bölümü yalnızca mutex'i tutan thread çalıştırabilir. Diğerleri sırasını bekler; böylece hiçbir güncelleme kaybolmaz.

Önemli noktalar

  • Mutex, bir kritik bölümü aynı anda yalnızca bir thread'in çalıştırmasına izin verir.
  • Mutex'i kilitli bulan thread'ler serbest bırakılana kadar bekler.
  • Bir mutex'i yalnızca onu kilitleyen thread açmalıdır.
  • Mutex'ler yarış durumlarını önler ama yanlış kullanılırsa deadlock'a yol açabilir.
  • Kritik bölümleri kısa tutun ve hatalarda bile kilidi her zaman serbest bırakın.

Örnek

Python'da paylaşılan bir sayacı korumakpython
import threading

counter = 0
lock = threading.Lock()  # Python's mutex

def add_many():
    global counter
    for _ in range(100_000):
        with lock:        # acquire; released automatically at the end
            counter += 1  # critical section: one thread at a time

threads = [threading.Thread(target=add_many) for _ in range(4)]
for t in threads: t.start()
for t in threads: t.join()
print(counter)  # always 400000

Sık sorulan sorular

Mutex ile semaphore arasındaki fark nedir?

Mutex tam olarak bir thread'i içeri alır ve onu alan thread tarafından serbest bırakılmalıdır. Semaphore ise bir izin sayısı tutar; bu yüzden aynı anda birkaç thread'i içeri alabilir ve herhangi bir thread onu serbest bırakabilir.

Kritik bölüm (critical section) nedir?

Kritik bölüm, paylaşılan veriye erişen ve aynı anda birden fazla thread tarafından çalıştırılmaması gereken bir kod parçasıdır. Mutex, onu korumanın olağan yoludur.

Spinlock nedir?

Spinlock, bekleyen bir thread'in uyumak yerine kilidi sıkı bir döngüde tekrar tekrar kontrol ettiği bir kilittir. Yalnızca kilitler çok kısa süre tutulduğunda verimlidir; bu yüzden çoğunlukla kernel'ların içinde kullanılır.

Sık karşılaştırılanlar

İlgili sayfalar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar