os.File的Write()方法是线程安全的吗?

6

我在想,调用os.File的Write()方法是否线程安全。我很难在文档中找到任何有关线程安全性的提及。

2个回答

12

惯例是(至少对于标准库而言):除非明确说明(或从上下文中显然),否则没有任何函数/方法可以安全地用于并发使用。

在没有外部同步的情况下,通过Write() 并发写入 os.File 不是安全的。


1
谢谢!你有指向任何提到这个约定的地方的指针吗? - Gabe
不好意思,我认为这只是一种惯例。 - Volker
对于那些遇到这个问题的人,你可以在Go 1.16中看到fd.writeLock();被用在Write(buf []byte)函数中,因此它似乎使用了内部同步。 - Sobhan Atar

1
在浏览了源代码后,我找到了以下方法,最终被file.Write()调用。由于存在竞争条件检查,我认为该调用实际上在Go中不是线程安全的 (源代码)。
然而,在操作系统级别上,这些系统调用似乎不会不是线程安全的。在浏览了一些内容后,我发现了这个有趣的答案,更加加深了我的怀疑。对于Windows,来源指示调用WriteFile,它似乎也是线程安全的

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接