【问题标题】:Is os.File's Write() threadsafe?os.File Write() 线程安全吗?
【发布时间】:2015-08-25 02:30:54
【问题描述】:

我想知道在 os.File 上调用 Write() 是否是线程安全的。我很难在文档中找到任何提及线程安全的内容。

【问题讨论】:

    标签: go


    【解决方案1】:

    约定(至少对于标准库而言)如下:除非明确说明(或从上下文中显而易见),否则任何函数/方法对于并发使用都是安全的。

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

    【讨论】:

    • 谢谢!您是否有任何提到该公约的地方的指针?
    • 不,抱歉。我认为这只是一个约定。
    • 遇到这个问题的朋友可以在go 1.16看到fd.writeLock();用在Write(buf []byte)函数中,看来是使用了内部同步
    【解决方案2】:

    稍微浏览一下源代码后,我发现了以下方法,该方法最终由 file.Write() 调用。由于有竞争条件检查,我假设调用实际上在 Go 中不是线程安全的 (Source)。

    但是,这些系统调用在操作系统级别上似乎不太可能不是线程安全的。经过一番浏览后,我发现了this interesting answer,这更加激起了我的怀疑。对于 Windows,source 表示对 WriteFile 的调用,它也似乎是 thread safe

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 2011-07-04
      • 2014-04-26
      • 2012-11-30
      • 2010-12-30
      • 2013-03-12
      • 2021-08-03
      相关资源
      最近更新 更多