Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

go内存一致性在不同go版本以及不同操作系统平台表现的行为不一致,作者知道什么原因吗 #2

Open
changqing98 opened this issue Apr 17, 2022 · 2 comments

Comments

@changqing98
Copy link

changqing98 commented Apr 17, 2022

var a string
var done bool

func setup() {
	a = "hello, world"
	done = true
}

func Test(t *testing.T) {
	go setup()
	for !done {
	}
	print(a)
}

在Ubuntu操作系统:
go1.13 会陷入死循环
go1.14及以上,可以正常运行,输出hello world

在MacOS操作系统:
go1.13及以上均可以正常运行,输出helloworld

作者知道什么原因吗?

@changqing98 changqing98 changed the title go内存一致性在不同go版本以及不同操作系统平台表现的行为不一致 go内存一致性在不同go版本以及不同操作系统平台表现的行为不一致,作者知道什么原因吗 Apr 17, 2022
@workwb
Copy link

workwb commented Apr 21, 2022

  1. 现在应该都是采用的多核处理器,所以就不说单核的问题了
  2. go1.13 及以前的版本不支持抢占式,也就是说出现死循环会一直占用cpu,不会让出。
  3. go1.14 增加协程抢占式,如果一个协程运行时间太久,会被其他协程抢到M,所以可以设置 done 为true。
  4. go1.13版本及以前,对于不同系统,可能系统的调度方式不一样,有可能创建协程之后,另外的协程绑定的M 可以被cpu 调用到

@workwb
Copy link

workwb commented Apr 21, 2022

var a string
var done bool

func setup() {
	a = "hello, world"
	done = true
}

func Test(t *testing.T) {
	go setup()
	for !done {
	}
	print(a)
}

在Ubuntu操作系统: go1.13 会陷入死循环 go1.14及以上,可以正常运行,输出hello world

在MacOS操作系统: go1.13及以上均可以正常运行,输出helloworld

作者知道什么原因吗?

嘿,兄弟,我想我说错了,是在单核才会存在这个问题。多核情况下不应该会出现这个问题才对。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants