Sobes.tech
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 (RLock ile), ancak sadece biri yazabilir (Lock ile). 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)
}