mirror of
https://github.com/chai2010/advanced-go-programming-book.git
synced 2025-05-24 12:32:21 +00:00
Merge pull request #85 from fuwensun/ch1-05-01
ch1:05 节加无缓存channel同步推导过程
This commit is contained in:
commit
224cd6bf5c
@ -345,7 +345,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
也可保证打印出“hello, world”。后台线程首先对`msg`进行写入,然后从`done`中接收信号,随后`main`线程向`done`发送对应的信号,最后执行`println`函数完成。但是,若该信道为带缓冲的(例如,`done = make(chan bool, 1)`),`main`线程的`done <- true`接收操作将不会被后台线程的`<-done`接收操作阻塞,该程序将无法保证打印出“hello, world”。
|
也可保证打印出“hello, world”。因为`main`线程中`done <- true`发送完成前,后台线程`<-done`接收已经开始,这保证`msg = "hello, world"`被执行了,所以之后`println(msg)`的msg已经被赋值过了。简而言之,后台线程首先对`msg`进行写入,然后从`done`中接收信号,随后`main`线程向`done`发送对应的信号,最后执行`println`函数完成。但是,若该信道为带缓冲的(例如,`done = make(chan bool, 1)`),`main`线程的`done <- true`接收操作将不会被后台线程的`<-done`接收操作阻塞,该程序将无法保证打印出“hello, world”。
|
||||||
|
|
||||||
对于带缓冲的Channel,**对于Channel的第`K`个接收完成操作发生在第`K+C`个发送操作完成之前,其中`C`是Channel的缓存大小。** 如果将`C`设置为0自然就对应无缓存的Channel,也即使第K个接收完成在第K个发送完成之前。因为无缓存的Channel只能同步发1个,也就简化为前面无缓存Channel的规则:**对于从无缓冲信道进行的接收,发生在对该信道进行的发送完成之前。**
|
对于带缓冲的Channel,**对于Channel的第`K`个接收完成操作发生在第`K+C`个发送操作完成之前,其中`C`是Channel的缓存大小。** 如果将`C`设置为0自然就对应无缓存的Channel,也即使第K个接收完成在第K个发送完成之前。因为无缓存的Channel只能同步发1个,也就简化为前面无缓存Channel的规则:**对于从无缓冲信道进行的接收,发生在对该信道进行的发送完成之前。**
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user