在上一篇文章中,当我们编写一个coroutine来等待小组时,我们很有用
我们的写作可能就是这样
可以看出,Sync.WaitGroup主要用于等待关闭一批Coroutines。例如,上面的主要Coroutine是在退出之前等待所有子核心关闭。
因此,让我们今天探讨同步程序的源代码。
Sync.WaitGroup放弃了上述DMEO,看起来非常简单
使用添加函数添加等待coroutines的数量
使用完成的功能来通知WaitGroup的当前Coroutine任务以完成
使用等待功能是等待所有子库户关闭
源代码路径:总源代码141行141
单个测试文件301
总共4个功能,1个结构
让我们一一做。这些功能已经完成了这些事情
WaitGroup正在等待
然后调用呼叫,完成并在完成时完成调用
同时,可以使用等待来阻止直到所有Goroutine完成
首次使用后不能复制waitgroup
我们可以看到候补组结构的2个成员
这是在GO语言的源代码中测试禁止副本的技术。如果WaitGroup在我们的程序中分配了操作,则该程序将报告错误
可以看出,状态1是3个数组中的许多元素,每个元素占32位
在64位系统中,64位原子操作需要64位对齐
然后,高32位对应于计数器,该计数器用于指示尚未完成任务的Coroutines数量
低32位对应于服务员数量
然后其余32位是SEMA信号量(将反映后续的源代码)
继续查看源代码
在这里,我们可以看到状态函数是返回WG.STATE1和SEMA字段指针中存储的状态的状态
在这里,您需要关注状态()函数的实现,有2种情况
小心脂鱼的具体原因可能有一点思考,
为什么在不同操作系统中的数据结构中,状态1数组的数据排名?
让我们仔细看看上述源代码
64-位系统:
当32位系统系统
这样的golang的主要原因是Goland将计数器和服务员合并为64位数据,因此在不同的操作系统中
由于字节的对齐,当64位数系统时,添加了前两个32位数据,恰好是64位,恰好是对齐的。
对于32位数字系统,前32位数据更适合放置SEMA。接下来的2 32位数据可以均匀地删除。
添加功能的主要功能是增加countr +delta以增加等待公司的数量:
我们可以看到添加功能。在状态函数获得上述64位变量(计数器和服务员)和SEMA信号量之后,通过函数将增量数据添加到计数器中
为什么三角洲转移到32位?
让我们谈谈状态函数的64位变量。高32位是国家,低32位是服务员。此处的三角洲添加到柜台,因此三角洲移动32位左至32位。
完成的功能没有什么特别的,直接调用添加函数以实现它
等待功能主要是增加服务员的数量:
将waitgroup中的Couter的数量阻止到0变为0
该函数主要由函数CA(比较和交换)操作。
显然,必须真实地在内部实现它并进行操作。如果是错误的,您需要再次继续循环
尽管WaitGroup .Go的具体实施只有141行,但我们需要反复研究其中的具体细节,并学习设计原理,例如状态1结构的设计思想。当值为值时,无需锁定需要,以便表现很好。
慢慢学习好思想,死在阳光下
朋友,您的支持和鼓励是我坚持的动力
好吧,这次在这里
技术是开放的,我们的心态应该是开放的。改变太阳的变化,并努力向前迈进。
我有点魔鬼,尼兹(Nezha),欢迎喜欢这个系列,下次再见?