为了账号安全,请及时绑定邮箱和手机立即绑定

多个戈鲁丁的数据重复

多个戈鲁丁的数据重复

Go
隔江千里 2022-08-01 17:26:41
我正在学习 goroutines 和通道,并且有一个问题,即如果多个 goroutine 尝试从同一通道获取数据会发生什么。Go 运行时如何确保由多个 goroutine 读取的通道中的数据仅提供给在通道上等待的一个 goroutine,而不会复制或发送到多个 goroutine。当有多个 goroutine 尝试从完全相同的通道获取数据时,go 运行时是否会阻止争用条件?是否有某种排序,例如先到先得的数据是哪个等待的goroutines?
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

通道是 Goroutine 相互同步的主要方式之一。因此,它们包含一种机制,可确保一次只有一个 goroutine 能够从通道中提取数据项,并且检索到的数据项不会重复。

您不能指望从同一通道成功读取多个goroutine的任何特定序列,因为哪个特定的goroutine的读取将完成取决于所使用的多线程算法。

看到这个讨论,Goroutines是合作安排的。这是否意味着不产生执行力的 goroutines 将导致 goroutines 逐个运行?

您可以根据多个 goroutine 是否从同一通道读取数据。然后,当通道中有要读取的数据时,其中一个 goroutine 将成功读取,并且等待从通道读取成功的任何其他 goroutine 都不会读取数据。

请参阅来自 golang-book.com 的并发性,其中解释了并发性以及通道和通道。

另请参阅如何使用通道在 Go 中安全地同步数据

另请参阅此答案,其中描述了使用通道而不是同步原语(如互斥锁)来维护侦听器的动态列表:https://stackoverflow.com/a/18897083/1466970

另请参阅这篇冗长且有些令人筋疲力尽的描述 Go 中的通道剖析 - Go 中的并发性。


查看完整回答
反对 回复 2022-08-01
?
MYYA

TA贡献1868条经验 获得超4个赞

这里对Go通道内部的分析相当不错 https://codeburst.io/diving-deep-into-the-golang-channels-549fd4ed21a8
基本上,通道维护一个等待读取操作的内部goroutine队列。当发送某些内容时,它只会从该队列中选择一个goroutine,并为其提供数据。如果没有人在等待 - 数据进入缓冲区或阻止写入器。

查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号