Middle+
Koritinlerde mutex nasıl çalışır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Coroutinelerde Mutex (Mutual Exclusion), ortak kaynakların aynı anda birden fazla coroutine tarafından erişimini engellemek için karşılıklı dışlama mekanizması sağlar.
Çalışma prensibi:
- Mutex'in kilitlenmesi: Kaydedilen kaynağa erişmek isteyen coroutine
lock()metodunu çağırır. - Kilitlenme: Eğer mutex boşsa, coroutine onu kilitler ve çalışmaya devam eder. Eğer başka bir coroutine tarafından kullanılıyorsa, çağıran coroutine mutex serbest kalana kadar askıya alınır.
- Mutex'in serbest bırakılması: Kaynakla işi bittiğinde, coroutine
unlock()metodunu çağırarak mutex'i serbest bırakır.
Coroutinelerde temel özellikler:
lock()non-bloklayıcıdır (boş mutex alındığında): Geleneksel thread'lerdelock()tüm thread'i engelleyebilirken, coroutinelerde mutex boşsa, engellemeden alınır.- Coroutine askıya alınması (kullanılan mutex durumunda): Mutex kullanılıyorsa, çağıran coroutine thread'i engellemez, askıya alınır ve serbest kalana kadar bekler. Bu, thread'in diğer coroutineleri çalıştırması için serbest kalmasını sağlar.
withLockgenişletme fonksiyonu: Mutex'i kullanmanın kullanışlı bir yolu olup, otomatik olarak kilitler ve serbest bırakır, hatta blok içinde istisna olsa bile.
Kullanım örneği:
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
// Kritik bölüm - korunan kaynak
counter++
delay(10) // İşlem simülasyonu
println("Counter: $counter")
} // Mutex burada otomatik olarak serbest bırakılır
}
fun main() = runBlocking {
repeat(100) {
launch {
incrementCounter()
}
}
delay(1000)
}
Bu örnekte, incrementCounter kritik bir bölümdür ve paylaşılan kaynak counter'ı değiştirir. Mutex, aynı anda sadece bir coroutine'un bu bölüme erişmesini sağlar, böylece yarış koşulları önlenir. withLock kullanımı mutex yönetimini basitleştirir.