Middle
Go'nun standart kütüphanesi hangi tür mutexler sağlar?
sobes.tech yapay zeka
AI'dan gelen yanıt
Go'nun standart kütüphanesi, sync paketinde iki temel mutex türü sağlar:
sync.Mutex: Temel bir mutex olup, karşılıklı dışlama sağlar. İki durumda olabilir: kilitli veya kilitsiz. Aynı anda sadece bir goroutine kilidi tutabilir.sync.RWMutex: Okuma/yazma için mutex. Birden fazla goroutine aynı anda veri okuyabilir (RLockile), ancak sadece biri yazabilir (Lockile). Yazma işlemi tüm işlemleri engeller (okuma ve yazma).
sync.Mutex için temel metodlar:
| Metod | Açıklama |
|---|---|
Lock() |
Mutex'i kilitler. Zaten kilitliyse, çağıran goroutine kilit serbest bırakılana kadar bekler. |
Unlock() |
Mutex'i serbest bırakır. Eğer mutex kilitli değilse, panik oluşturur. |
sync.RWMutex için temel metodlar:
| Metod | Açıklama |
|---|---|
Lock() |
Yazma için mutex'i kilitler. Tüm okuma ve yazma işlemlerini engeller. |
Unlock() |
Yazma için mutex'i serbest bırakır. Eğer kilitli değilse, panik oluşturur. |
RLock() |
Okuma için mutex'i kilitler. Diğer okuma işlemlerine engel değildir. Yazma kilidi varsa bekler. |
RUnlock() |
Okuma için mutex'i serbest bırakır. Eğer kilitli değilse, panik oluşturur. |
RLocker() |
RLock ve RUnlock kullanan bir Locker döner. |
sync.Mutex kullanımı örneği:
package main
import (
"fmt"
"sync"
"time"
)
var counter int
var mutex sync.Mutex
func increment() {
mutex.Lock() // Mutex'i kilitler
counter++
fmt.Printf("Counter: %d\n", counter)
mutex.Unlock() // Mutex'i serbest bırakır
}
func main() {
for i := 0; i < 10; i++ {
go increment()
}
time.Sleep(time.Second) // Goroutine'lerin bitmesini sağlar
}
sync.RWMutex kullanımı örneği:
package main
import (
"fmt"
"sync"
"time"
)
var data string
var rwMutex sync.RWMutex
func readData() {
rwMutex.RLock() // Okuma için kilitler
fmt.Printf("Veri okuma: %s\n", data)
rwMutex.RUnlock() // Okuma için kilidi bırakır
}
func writeData(newData string) {
rwMutex.Lock() // Yazma için kilitler
data = newData
fmt.Printf("Veri yazma: %s\n", data)
rwMutex.Unlock() // Yazma için kilidi bırakır
}
func main() {
go writeData("Merhaba")
time.Sleep(100 * time.Millisecond) // Yazma işlemi için zaman tanır
for i := 0; i < 5; i++ {
go readData() // Birden fazla okuma aynı anda yapılabilir
}
time.Sleep(time.Second) // Goroutine'lerin bitmesini sağlar
go writeData("Dünya")
time.Sleep(100 * time.Millisecond)
go readData()
time.Sleep(time.Second)
}