Sobes.tech
Middle

Ինչպես է աշխատում պայմանական փոփոխականը (sync.Cond) Go-ում?

sobes.tech AI

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

Go լեզվում, sync.Cond — դա պայմանական փոփոխական է, որը օգտագործվում է goroutine-ների համակարգման համար, թույլ տալով մեկ կամ մի քանի goroutine-ների սպասել որոշակի պայմանի կատարմանը:

Հիմնական մեթոդներ՝

  • Wait(): բլոկավորում է ընթացիկ goroutine-նն ու ազատում է կապված mutex-ը, մինչև որ կանչվի Signal() կամ Broadcast():
  • Signal(): արթնացնում է մի goroutine, որը սպասում է պայմանական փոփոխականին:
  • Broadcast(): արթնացնում է բոլոր goroutine-ներին, որոնք սպասում են պայմանական փոփոխականին:

Օգտագործման օրինակ՝

var mu sync.Mutex
cond := sync.NewCond(&mu)

// Goroutine, որը սպասում է պայմանին
ngo func() {
    mu.Lock()
    cond.Wait() // սպասում է սիգնալին
    // պայմանը կատարվեց
    mu.Unlock()
}()

// Goroutine, որը սիգնալ է ուղարկում
mu.Lock()
// փոխում է այն վիճակը, որի սպասում էր առաջին goroutine-նն
cond.Signal() // կամ cond.Broadcast()
mu.Unlock()

Կարևոր է, որ Wait()-ը կանչվի փակված mutex-ով, և Wait()-ի ժամանակ mutex-ը ժամանակավոր ազատվում է, որպեսզի այլ goroutine-ներ կարողանան փոխել վիճակը և կանչել Signal() կամ Broadcast(): Բացվելուց հետո, Wait()-ը կրկին փակում է mutex-ը և վերադարձնում:

Այսպիսով, sync.Cond-ը թույլ է տալիս արդյունավետորեն սինխրոնիզացնել goroutine-ների կատարումը վիճակի փոփոխությունների հիման վրա։