【发布时间】:2021-03-20 16:03:31
【问题描述】:
以下代码不会引发数据竞争
package main
import (
"fmt"
"os"
"strings"
)
func main() {
x := strings.Repeat(" ", 1024)
go func() {
for {
fmt.Fprintf(os.Stdout, x+"aa\n")
}
}()
go func() {
for {
fmt.Fprintf(os.Stdout, x+"bb\n")
}
}()
go func() {
for {
fmt.Fprintf(os.Stdout, x+"cc\n")
}
}()
go func() {
for {
fmt.Fprintf(os.Stdout, x+"dd\n")
}
}()
<-make(chan bool)
}
我尝试了多个长度的数据,变体https://play.golang.org/p/29Cnwqj5K30
This post 表示不是 TS。
This mail 没有真正回答问题,或者我没听懂。
os 和 fmt 的包文档对此没有过多提及。我承认我没有挖掘这两个包的源代码来寻找进一步的解释,它们对我来说似乎太复杂了。
有哪些建议和参考?
【问题讨论】:
-
不确定这是否有帮助,但os 确实说:“注意:文件上的最大并发操作数可能受到操作系统或系统的限制。数量应该是高,但超过它可能会降低性能或导致其他问题。”
-
相关/可能重复:When to use log over fmt for debugging and printing error? 接受的答案表明它不安全,这取决于操作系统。
-
是的,Cerise Limón 的回答最接近我的提问 (stackoverflow.com/a/41390023/4466350)。我相信我记得这一直存在争议,并且专门实施了一些更改以使其尽可能透明(如果不是完全 TS)。但没有参考文献.... mkopriva 引用的注释不清楚,可能相关,可能不相关。感谢您的意见。
-
该函数是线程安全的,如果它在文档中明确指定。
标签: go