Middle+
რა გამოვა? ```go package main import ( "fmt" "runtime" ) func main() { runtime.GOMAXPROCS(1) done := false go func() { done = true }() for !done { } fmt.Println("finished") } ```
sobes.tech AI
პასუხი AI-სგან
ამ კოდში შესაძლებელია უსასრულო ციკლის მდგომარეობა. ცვლადი done იცვლება გორუტინაში, მაგრამ მთავარი გორუტინში არ არსებობს სინქრონიზაციის მექანიზმი ან გამოყენებული არ არის ატომური ოპერაციები ცვლილებების ხილვადობის გარანტიისთვის.
კომპილატორის ოპტიმიზაციებისა და CPU-ის კეშირების გამო, მთავარი ციკლი for !done {} შეიძლება არასოდეს ნახოს სხვა გორუტინიდან done = true განახლება, და პროგრამა ამ ციკლში გაჩერდება.
თუ მოხსნიან runtime.GOMAXPROCS(1), ანუ ნებადართულია სქედულატორს გამოიყენოს რამდენიმე OS-თემა, ალბათობა იმისა, რომ ცვლილება დაინახოს, გაიზრდება, მაგრამ სინქრონიზაციის გარეშე ეს გარანტირებული არ არის.
სწორი მეთოდი არის გამოყენება არხების ან sync/atomic პაკეტიდან სინქრონიზაციის.
მაგალითი არხით:
package main
import "fmt"
func main() {
done := make(chan struct{})
go func() {
done <- struct{}{}
}()
<-done
fmt.Println("finished")
}