Sobes.tech
Middle

Go standart kutubxonasi qanday turdagi mutexlarni taqdim etadi?

sobes.tech AI

AIdan javob

Go standart kutubxonasi sync paketida ikkita asosiy mutex turini taqdim etadi:

  • sync.Mutex: Asosiy mutex bo‘lib, u o‘zaro chiqarishni ta’minlaydi. U ikki holatda bo‘lishi mumkin: bloklangan yoki bloklanmagan. Faqat bir goroutine bloklashni ushlab turishi mumkin.
  • sync.RWMutex: O‘qish/yozish uchun mutex. Bir vaqtning o‘zida ko‘p goroutinlar ma’lumotni o‘qishi mumkin (RLock yordamida), lekin faqat bittasi yozishi mumkin (Lock yordamida). Yozish barcha operatsiyalarni (o‘qish va yozish) bloklaydi.

sync.Mutex ning asosiy metodlari:

Metod Tavsifi
Lock() Mutexni bloklaydi. Agar u allaqachon bloklangan bo‘lsa, chaqiruvchi goroutine uni bo‘shatguncha bloklanadi.
Unlock() Mutexni ochadi. Agar mutex bloklanmagan bo‘lsa, panic yuzaga keladi.

sync.RWMutex ning asosiy metodlari:

Metod Tavsifi
Lock() Yozish uchun mutexni bloklaydi. Barcha o‘qish va yozish operatsiyalarini bloklaydi.
Unlock() Yozish uchun mutexni ochadi. Agar bloklangan bo‘lmasa, panic yuzaga keladi.
RLock() O‘qish uchun mutexni bloklaydi. Boshqa o‘qish operatsiyalariga to‘sqinlik qilmaydi. Yozish bloklansa, kutadi.
RUnlock() O‘qish uchun mutexni ochadi. Agar bloklanmagan bo‘lsa, panic yuzaga keladi.
RLocker() RLock va RUnlock ishlatadigan Locker ni qaytaradi.

sync.Mutex dan foydalanish misoli:

package main

import (
	"fmt"
	"sync"
	"time"
)

var counter int
var mutex sync.Mutex

func increment() {
	mutex.Lock() // Mutexni bloklaydi
	counter++
	fmt.Printf("Counter: %d\n", counter)
	mutex.Unlock() // Mutexni ochadi
}

func main() {
	for i := 0; i < 10; i++ {
		go increment()
	}
	time.Sleep(time.Second) // Goroutinlar tugashini kutadi
}

sync.RWMutex dan foydalanish misoli:

package main

import (
	"fmt"
	"sync"
	"time"
)

var data string
var rwMutex sync.RWMutex

func readData() {
	rwMutex.RLock() // O‘qish uchun bloklaydi
	fmt.Printf("Ma’lumotlarni o‘qish: %s\n", data)
	rwMutex.RUnlock() // O‘qish uchun ochadi
}

func writeData(newData string) {
	rwMutex.Lock() // Yozish uchun bloklaydi
	data = newData
	fmt.Printf("Ma’lumot yozish: %s\n", data)
	rwMutex.Unlock() // Yozish uchun ochadi
}

func main() {
	go writeData("Salom")
	time.Sleep(100 * time.Millisecond) // Yozishni kutadi

	for i := 0; i < 5; i++ {
		go readData() // Bir vaqtning o‘zida ko‘p o‘qish mumkin
	}

	time.Sleep(time.Second) // Goroutinlar tugashini kutadi
	go writeData("Dunyo")
	time.Sleep(100 * time.Millisecond)
	go readData()

	time.Sleep(time.Second)
}