chenyahui / chenyahui.github.io

My blog
http://www.cyhone.com
0 stars 2 forks source link

Golang WaitGroup 原理深度剖析 | 编程沉思录 #55

Open chenyahui opened 3 years ago

chenyahui commented 3 years ago

https://www.cyhone.com/articles/golang-waitgroup/

sync.WaitGroup 是 Golang 中常用的并发措施,我们可以用它来等待一批 Goroutine 结束。 WaitGroup 的源码也非常简短,抛去注释外也就 100 行左右的代码。但即使是这 100 行代码,里面也有着关乎内存优化、并发安全考虑等各种性能优化手段。 本文将基于 go-1.13 的源码 进行分析,将会涉及以下知识点: WaitGroup 的实现逻辑 WaitGroup

jiekun commented 3 years ago

~Great. 支持一下,希望多多发文讲解下其他的包/数据结构

chenyahui commented 3 years ago

@2014BDuck ~Great. 支持一下,希望多多发文讲解下其他的包/数据结构

可以~ 有没有什么想要了解的包?

jiekun commented 3 years ago

@chenyahui

@2014BDuck ~Great. 支持一下,希望多多发文讲解下其他的包/数据结构

可以~ 有没有什么想要了解的包?

没~写了都会看

chenyahui commented 3 years ago

@2014BDuck

@chenyahui

@2014BDuck ~Great. 支持一下,希望多多发文讲解下其他的包/数据结构

可以~ 有没有什么想要了解的包?

没~写了都会看

哈哈,感谢支持~

fivezh commented 3 years ago

有些文章会讲到,WaitGroup 两种不同的内存布局方式是 32 位系统和 64 位系统的区别,这其实不太严谨。准确的说法是 32 位对齐和 64 位对齐的区别。因为在 32 位系统下,state1 变量也有可能恰好符合 64 位对齐。

很赞,困惑许久的问题,这里只看wg当前的字节对齐情况,来满足64位对齐的要求

chenyahui commented 3 years ago

@fivezh

有些文章会讲到,WaitGroup 两种不同的内存布局方式是 32 位系统和 64 位系统的区别,这其实不太严谨。准确的说法是 32 位对齐和 64 位对齐的区别。因为在 32 位系统下,state1 变量也有可能恰好符合 64 位对齐。

很赞,困惑许久的问题,这里只看wg当前的字节对齐情况,来满足64位对齐的要求

  • 64位系统均满足8字节对齐,8字节state+4字节sema
  • 32位系统一定概率满足8字节对齐,同上
  • 32位系统一定概率不满足8字节对齐时,sema前置4字节,来保证后面的state满足8字节对齐

总结的非常好 ~

xuanskyer commented 2 years ago

@chenyahui

@2014BDuck ~Great. 支持一下,希望多多发文讲解下其他的包/数据结构

可以~ 有没有什么想要了解的包?

大佬,分析下reflect包呗

chenyahui commented 2 years ago

@xuanskyer

@chenyahui

@2014BDuck ~Great. 支持一下,希望多多发文讲解下其他的包/数据结构

可以~ 有没有什么想要了解的包?

大佬,分析下reflect包呗

简单来说就是golang基于它的runtime,可以管理所有对象的元信息。拿到对象的元信息这个过程就是反射了,我会记下,之后应该会写篇文章讨论下~

lotusgrm commented 2 years ago

@chenyahui

@2014BDuck ~Great. 支持一下,希望多多发文讲解下其他的包/数据结构

可以~ 有没有什么想要了解的包?

大佬可以分析一下 context 包吗

chenyahui commented 2 years ago

@lotusgrm

@chenyahui

@2014BDuck ~Great. 支持一下,希望多多发文讲解下其他的包/数据结构

可以~ 有没有什么想要了解的包?

大佬可以分析一下 context 包吗

可以~ 我先记下~

RayleBool commented 2 years ago

图上waiter和counter标示反了

chenyahui commented 2 years ago

@RayleBool 图上waiter和counter标示反了

的确是写错了,非常感谢反馈!图里面和文章里面的错误都已经修改了

learnaiwb commented 1 year ago

分析下 锁的底层、channel 条件变量 gmp gc这块吧

houjibofa2050 commented 1 year ago

count和wait的位置错了吧,count应该在wait的前面 64位 states的位置应该是 count+waiter+sema 32位应该是seama+count+waiter