|
|
|
|
|
by alecrn
3412 days ago
|
|
My understanding is there are only scheduling guarantees around synchronization points between goroutines through chans or mutexes and stuff. Go's concurrency model is inspired by Hoare's communicating sequential processes which kinda has the same idea: http://usingcsp.com/cspbook.pdf For instance in this program: func main() {
point1 := make(chan bool)
point2 := make(chan bool)
go func() {
point1 <- true
fmt.Println("hello")
point2 <- true
}()
<-point1
time.Sleep(3 * time.Second)
<-point2
}
An unbuffered channel read is always matched with a corresponding write. Let's call the point at which `point1 <- true` occurs and `<-point1` occurs T1 and the point at which `point2 <- true` occurs and `<-point2` occurs T2. fmt.Println("hello") and time.Sleep(3*time.Second) are both guaranteed to occur between T1 and T2. If we didn't have T2 there's no guarantee fmt.Println("hello") would run before the program exits.Maybe I'm wrong but this is my understanding of Hoare's and go's concurrency model. |
|