Mutex
Karşılıklı Dışlama (Mutual Exclusion)
- Okunuşu
- myuteks
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
Ö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
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 400000Sı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
- Semaphoreİşletim Sistemleri, s. 27Semaphore, mevcut izinlerin sayacını tutan bir senkronizasyon aracıdır; belirli bir sayıya kadar thread'in bir kaynağı aynı anda kullanmasına izin verir.
- Race Conditionİşletim Sistemleri, s. 24Race condition, programın sonucunun paylaşılan veriyi aynı anda kullanan thread, process veya isteklerin öngörülemeyen zamanlamasına bağlı olduğu hatadır.
- Deadlockİşletim Sistemleri, s. 7Deadlock, iki ya da daha fazla thread veya process'in kaynakları bırakmaları için birbirini sonsuza dek beklediği ve hiçbirinin ilerleyemediği durumdur.
- Threadİşletim Sistemleri, s. 34Thread, işletim sisteminin zamanlayabileceği en küçük yürütme birimidir; bir process içinde çalışır ve o process'in belleğini diğer thread'lerle paylaşır.
- EşzamanlılıkProgramlamanın Temelleri, s. 19Eşzamanlılık, bir programın birden çok görevde örtüşen zaman dilimlerinde ilerleyebilme yeteneğidir; örneğin birçok kullanıcıya aynı anda hizmet vermek gibi.
- İyimser KilitlemeVeritabanları, s. 15İyimser kilitleme, transaction'ları kilit tutmadan ilerleten ve çakışmaları kayıt anında sürüm numarasına bakarak yakalayan bir eşzamanlılık tekniğidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin