concurrency - 相同的 Golang 代码不同的输出,为什么?

标签 concurrency go

我正在尝试执行来自 golang.org 的示例:http://tour.golang.org/#63

  • 我已经更改了代码以测试 Gosched 到底做了什么。*

你可以看到输出是: enter image description here

hello
hello
hello
hello
hello

但是当我将这些代码复制到我的 Mac OS X 10.8(Go 版本 1.0.3)时,输出发生了变化: enter image description here xxxxxx$ 去版本 去版本go1.0.3 xxxxxx$ 去运行 goroutine.go 你好 世界 你好 世界 你好 世界 你好 世界 你好 世界

根据这个answer ,我应该使用 runtime.GoSched,但实际上我不需要。所以我认为出了点问题。

请帮我解决这个问题,非常感谢。

最佳答案

这里的问题是您有两种不同的实现方式。

在本地,每次调用 fmt.Println 时,您的代码都会让步给调度程序。 Println 写入执行系统调用的标准输出。所有系统调用的产生方式与 runtime.Gosched 相同。

play.golang.org 是一个黑盒子。我们实际上并不知道它是如何工作的。但是,从您给出的示例来看,当调用 fmt.Println 时,play 似乎没有执行系统调用。这是有道理的。他们可能用缓冲区替换了 os.Stdout 来保存打印的内容。

关于concurrency - 相同的 Golang 代码不同的输出,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13262487/

相关文章:

java - 当正在等待的线程收到通知时,另一个线程是否可以进入监视器?

multithreading - 原子性和不变性是并发/并行编程中解决相同问题的两种不同方法吗?

c - 预编译 Go 程序中依赖 C 来提高速度的部分

encryption - 输入字节 0 处的 golang 非法 base64 数据

java - 调用 notifyAll() 后线程未唤醒

Java并发使电梯停在附近楼层

java - JSR-133 说明书如何强制执行 Java 内存模型做出的所有保证

windows - 在 Windows 上,是否可以以不同的用户身份运行单个 goroutine?

postgresql - 如何将 golang map 插入 PostgreSQL

go - 在 Go 项目中组织 Assets 文件