从一个data race问题学到的

前几天我在学习内存屏障的时候搜到一篇文章「Golang Memory Model」,其中在介绍 CPU 缓存一致性的时候提到一个例子,带给我一些困惑,本文记录下解惑过程。 既然是在介绍 CPU 缓存一致性的时候举的例子,那么理所应当与此有关,看代码: package main import time func main() { running := true go func() { println(start thread1) count := 1 fo

从一个data race问题学到的

前几天我在学习内存屏障的时候搜到一篇文章「Golang Memory Model」,其中在介绍 CPU 缓存一致性的时候提到一个例子,带给我一些困惑,本文记录下解惑过程。 既然是在介绍 CPU 缓存一致性的时候举的例子,那么理所应当与此有关,看代码: package main import time func main() { running := true go func() { println(start thread1) count := 1 fo

为什么会有atomic.LoadInt32

前些天我们聊了 Golang 内存对齐的话题,后来我突然想到另一个问题:为什么会有 atomic.LoadInt32?可能你觉得思维太跳跃了,容我慢慢道来:首先,有 atomic.LoadInt64 很正常,因为对一个 int64 来说,它的大小是 8 个字节,如果是 32 位平台的话(字长 4 字节),CPU 一次最多操作 4 个字节,需要两次才能拿到全部数据,所以封装一个 atomic.LoadInt64 来实现原子操作;但是,对一个 int32 数据来说,它的大小是 4

为什么会有atomic.LoadInt32

前些天我们聊了 Golang 内存对齐的话题,后来我突然想到另一个问题:为什么会有 atomic.LoadInt32?可能你觉得思维太跳跃了,容我慢慢道来:首先,有 atomic.LoadInt64 很正常,因为对一个 int64 来说,它的大小是 8 个字节,如果是 32 位平台的话(字长 4 字节),CPU 一次最多操作 4 个字节,需要两次才能拿到全部数据,所以封装一个 atomic.LoadInt64 来实现原子操作;但是,对一个 int32 数据来说,它的大小是 4

再谈Golang内存对齐

关于 Golang 内存对齐,昨天已经写了一篇「浅谈Golang内存对齐」,可惜对一些细节问题的讨论语焉不详,于是便有了今天这篇「再谈Golang内存对齐」。 让我们回想一下 groupcache 和 sync.WaitGroup 中的做法,为了规避在 32 位环境下 atomic 操作 64 位数的 BUG,它们采取了截然不同的做法: // groupcache type Group struct { name string getter Getter peersO

再谈Golang内存对齐

关于 Golang 内存对齐,昨天已经写了一篇「浅谈Golang内存对齐」,可惜对一些细节问题的讨论语焉不详,于是便有了今天这篇「再谈Golang内存对齐」。 让我们回想一下 groupcache 和 sync.WaitGroup 中的做法,为了规避在 32 位环境下 atomic 操作 64 位数的 BUG,它们采取了截然不同的做法: // groupcache type Group struct { name string getter Getter peersO

浅谈Golang内存对齐

如果你在 golang spec 里以「alignment」为关键字搜索的话,那么会发现与此相关的内容并不多,只是在结尾介绍 unsafe 包的时候提了一下,不过别忘了字儿越少事儿越大: Computer architectures may require memory addresses to be aligned; that is, for addresses of a variable to be a multiple of a factor, the variable

浅谈Golang内存对齐

如果你在 golang spec 里以「alignment」为关键字搜索的话,那么会发现与此相关的内容并不多,只是在结尾介绍 unsafe 包的时候提了一下,不过别忘了字儿越少事儿越大: Computer architectures may require memory addresses to be aligned; that is, for addresses of a variable to be a multiple of a factor, the variable

手把手教你用TARS

在中国,有一个简单的方法可以用来判断一个互联网公司够不够大,那就是看其是否开源过 rpc 框架!比如阿里巴巴的 dubbo,或者腾讯的 tars,小公司往往会对这些大公司的产品趋之若鹜,不过一个可悲的现实是大公司自己往往并不用他们开源的版本,这就好比皇帝总是把自己看不上眼的女人赏赐给臣民,不过能得到皇帝的赏赐总是好事,下面让我手把手教你用 tars,更具体的说是 tarsgo,也就是 tars 的 golang 实现。 实际动手前,最好熟读官方文档,特别是基础概念和基础通讯

手把手教你用TARS

在中国,有一个简单的方法可以用来判断一个互联网公司够不够大,那就是看其是否开源过 rpc 框架!比如阿里巴巴的 dubbo,或者腾讯的 tars,小公司往往会对这些大公司的产品趋之若鹜,不过一个可悲的现实是大公司自己往往并不用他们开源的版本,这就好比皇帝总是把自己看不上眼的女人赏赐给臣民,不过能得到皇帝的赏赐总是好事,下面让我手把手教你用 tars,更具体的说是 tarsgo,也就是 tars 的 golang 实现。 实际动手前,最好熟读官方文档,特别是基础概念和基础通讯