GO的多协程程序,多个CPU执行,共享数据出现不一致的问题

首先,先看看这一段代码

var x, y int
func main()  {
	go func() {
		x = 1
		fmt.Println("y = ", y)
	}()
	go func() {
		y = 1
		fmt.Println("x = ", x)
	}()
	time.Sleep(time.Second)
}

打印的结果又很多种

y = 0 x = 1

x = 0 y = 1

x = 1 y = 1

y = 1 x = 1

但是还有一种结果是: x = 0 y = 0,虽然你执行的时候可能不会出现这种情况,但是他确实是存在的

出现这种结果的可能有两个原因:

一,

因为赋值和打印的变量不是同一个,所以编译器就可能会认为两条语句的执行顺序不会影响结果,然后就交换了这两个语句的执行顺序

二,

两个协程可能在不同的CPU上运行,假设第一个协程在CPU1上运行,第二个协程在CPU2上运行,但是由于每个CPU都会缓存,只有在必要的时候才会写入主内存,其他的CPU才能看到。

CPU1对 x 进行了修改,但是它只是在自己的本地缓存进行了修改,并没有写入到主内存,所以CPU2看不到,它就打印它上次从主内存取得的过期值。同理CPU1也是打印了 y 的过期值。所以就会出现 x和y同时等于零的情况

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值