【发布时间】:2015-08-25 02:30:54
【问题描述】:
我想知道在 os.File 上调用 Write() 是否是线程安全的。我很难在文档中找到任何提及线程安全的内容。
【问题讨论】:
标签: go
我想知道在 os.File 上调用 Write() 是否是线程安全的。我很难在文档中找到任何提及线程安全的内容。
【问题讨论】:
标签: go
约定(至少对于标准库而言)如下:除非明确说明(或从上下文中显而易见),否则任何函数/方法对于并发使用都是安全的。
在没有外部同步的情况下通过Write() 并发写入os.File 是不安全的。
【讨论】:
fd.writeLock();用在Write(buf []byte)函数中,看来是使用了内部同步
稍微浏览一下源代码后,我发现了以下方法,该方法最终由 file.Write() 调用。由于有竞争条件检查,我假设调用实际上在 Go 中不是线程安全的 (Source)。
但是,这些系统调用在操作系统级别上似乎不太可能不是线程安全的。经过一番浏览后,我发现了this interesting answer,这更加激起了我的怀疑。对于 Windows,source 表示对 WriteFile 的调用,它也似乎是 thread safe。
【讨论】: