Sobes.tech
Middle

Ի՞նչ տեսակի մյուտեքսներ է տրամադրում Go-ի ստանդարտ գրադարանը։

sobes.tech AI

Պատասխան AI-ից

Ստանդարտ գրադարանն Go-ի sync փաթեթում առաջարկում է երկու հիմնական տեսակի մուտեքսներ.

  • sync.Mutex: Հիմնական մուտեքս, որը ապահովում է փոխադարձ բացառություն: Կարող է լինել երկու վիճակում՝ փակ կամ բաց: Միաժամանակ միայն մեկ գորուտին կարող է պահել փակումը:
  • sync.RWMutex: Կարդալու/գրելու մուտեքս: Ինքը թույլ է տալիս միաժամանակ մի քանի գորուտին կարդալ տվյալները (RLock-ով), բայց միայն մեկին գրել (Lock-ով): Գրելու գործողությունը փակ է դարձնում բոլոր մյուս գործողությունները՝ ինչպես կարդալը, այնպես էլ գրելը:

sync.Mutex-ի հիմնական մեթոդները:

մեթոդ նկարագրություն
Lock() Փակել մուտեքսը: Եթե արդեն փակ է, կանչող գորուտին սպասում է բացմանը:
Unlock() Բացել մուտեքսը: Եթե մուտեքսը չէր փակված, առաջանում է panic:

sync.RWMutex-ի հիմնական մեթոդները:

մեթոդ նկարագրություն
Lock() Փակել մուտեքսը գրելու համար: Բլոկավորում է բոլոր կարդալու և գրելու գործողությունները:
Unlock() Բացել մուտեքսը գրելու համար: Եթե չէր փակված, առաջանում է panic:
RLock() Փակել մուտեքսը կարդալու համար: Չի բլոկավորում մյուս կարդալու գործողությունները: Բլոկավորվում է, եթե գրելու մուտեքսը փակ է:
RUnlock() Բացել մուտեքսը կարդալու համար: Եթե չէր փակված, առաջանում է panic:
RLocker() Վերադարձնում է Locker, որը օգտագործում է RLock և RUnlock-ը:

Օրինակ sync.Mutex-ի օգտագործման:

package main

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

var counter int
var mutex sync.Mutex

func increment() {
	mutex.Lock() // Փակել մուտեքսը
	counter++
	fmt.Printf("Counter: %d\n", counter)
	mutex.Unlock() // Բացել մուտեքսը
}

func main() {
	for i := 0; i < 10; i++ {
		go increment()
	}
	time.Sleep(time.Second) // Կատարման ավարտին սպասել
}

Օրինակ sync.RWMutex-ի օգտագործման:

package main

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

var data string
var rwMutex sync.RWMutex

func readData() {
	rwMutex.RLock() // Կարդալու համար փակել
	fmt.Printf("Կարդում տվյալները: %s\n", data)
	rwMutex.RUnlock() // Բացել կարդալու համար
}

func writeData(newData string) {
	rwMutex.Lock() // Գրելու համար փակել
	data = newData
	fmt.Printf("Գրելու տվյալները: %s\n", data)
	rwMutex.Unlock() // Բացել գրելու համար
}

func main() {
	go writeData("Hello")
	time.Sleep(100 * time.Millisecond) // Կատարման ավարտին սպասել

	for i := 0; i < 5; i++ {
		go readData() // Մեծ քանակությամբ միաժամանակյա կարդալու գործողություններ թույլատրվում են
	}

	time.Sleep(time.Second) // Կատարման ավարտին սպասել
	go writeData("World")
	time.Sleep(100 * time.Millisecond)
	go readData()

	time.Sleep(time.Second)
}