2 回答
TA贡献1817条经验 获得超6个赞
goroutine 可以阻止等待通道准备好发送或接收,但通道本身永远不会处于“阻塞”状态。
第一个程序不会死机,因为 main 函数执行到最后并终止程序。
同一 go-routine 能否在写入通道后执行通道读取操作?
否,如果通道未缓冲(默认值)。对于无缓冲信道,发送 goroutine 会阻塞,直到接收 goroutine 准备就绪。
单个 goroutine 不能同时执行发送和接收。如果只有一个 goroutine 发送到通道,则 goroutine 会永远阻塞。
如果某个通道被阻塞,其他 go-routine 还能向它发送消息吗?
goroutine 可以在通道关闭之前的任何时间将值发送到通道。Goroutine 可以阻止等待通道准备好发送。
如果 go-routine 尝试将消息发送到被阻止的通道,会发生什么情况?它会通过错误,还是什么也没发生,或者?
Goroutine可以阻止等待频道准备就绪。通道本身未处于阻塞状态。
TA贡献1934条经验 获得超2个赞
通道不会“阻塞”。通道上的读取或写入操作可能会阻塞。
对于无缓冲通道(这是您上面的内容):写入操作将阻止写入 goroutine,直到另一个 goroutine 准备好从该通道读取。当读取 goroutine 准备好读取(即执行 <-ch)时,则写入和读取发生,并且两个 goroutine 继续运行。
对于缓冲通道:只要通道缓冲区未满,写入操作就不会阻塞。同样,如果有要从通道读取的内容,则读取不会阻塞。
至于你的问题:
如果所讨论的通道未缓冲,则写入操作将阻塞,因为只有当另一个 goroutine 正在从该通道读取时,写入操作才能继续。因此,goroutine不会进展为从通道读取。如果这是一个缓冲通道,并且通道未满,则相同的 goroutine 可以写入该通道并从中读取。
如果一个 goroutine 正在等待写入一个通道,而另一个 goroutine 来写入它,它也会阻塞,直到另一个 goroutine 从通道读取。
如果 goroutine 尝试写入已满的通道,它将阻塞,直到另一个 goroutine 可以从该通道读取。
- 2 回答
- 0 关注
- 68 浏览
添加回答
举报