Sobes.tech
Junior — Middle

Կարո՞ղ է լինել տվյալների միաժամանակյա գրառում ալիքում առանց բուֆեր օգտագործելու։

sobes.tech AI

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

Go-ում ալիքները կարող են լինել բուֆերային կամ առանց բուֆերի: Բուֆերային չլինող ալիքներում գրելը (ուղարկումը) բլոկվում է, մինչև որ մյուս goroutine-ը կարդա արժեքը ալիքից:

Անհնար է միաժամանակյա գրանցում առանց բուֆերի ալիքին, քանի որ ուղարկումը բլոկվում է մինչև ընդունումը, և միայն մեկ ուղարկող կարող է փոխանցել տվյալներ միաժամանակ:

Եթե անհրաժեշտ է կատարել միաժամանակյա գրանցում առանց բլոկավորման, օգտագործվում են բուֆերային ալիքներ, որտեղ ուղարկողը կարող է տեղադրել տվյալներ բուֆերում առանց սպասելու անմիջական ընդունմանը:

Բնօրինակ առանց բուֆերի ալիք:

ch := make(chan int) // առանց բուֆերի ալիք

// Ուղարկումը բլոկվում է, մինչև որ մեկը կարդա
ch <- 1

Միաժամանակյա գրանցում առանց բլոկավորման համար անհրաժեշտ է բուֆեր:

ch := make(chan int, 2) // 2 տարրով բուֆեր
ch <- 1 // չի բլոկվում
ch <- 2 // չի բլոկվում

Ամփոփում՝ առանց բուֆերի, միաժամանակյա գրանցումը հնարավոր չէ։