linux - os.File.Write() 线程在 golang 中安全吗?

当两个 Goroutines 通过 os.File.Write() 同时写入文件时,它是线程安全的吗?

根据这个问题Is os.File's Write() threadsafe? ,它不是线程安全的。但是下面代码的输出文件./test.txt没有出现错误。

然后根据这个问题Safe to have multiple processes writing to the same file at the same time? [CentOs 6, ext4] ,POSIX“原始”IO 系统调用是线程安全的。 os.File.Write() 使用 POSIX IO 系统调用,所以我们可以说它是线程安全的吗?

package main

import (
    "fmt"
    "os"
    "sync"
)

func main() {
    filePath := "./test.txt"

    var wg sync.WaitGroup
    wg.Add(2)

    worker := func(name string) {
        // file, _ := os.Create(filePath)
        file, _ := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE, 0666)
        defer file.Close()
        defer wg.Done()
        for i := 0; i < 100000; i++ {
            if _, err := file.Write([]byte(name + ": is os.File.Write() thread safe?\n")); err != nil {
                fmt.Println(err)
            }
        }
    }

    go worker("worker1")
    go worker("worker2")

    wg.Wait()
}

最佳答案

文档没有明确说明它是线程安全的。

不过看看 Go 1.16.5 版本的源代码:

// Write implements io.Writer.
func (fd *FD) Write(buf []byte) (int, error) {
    if err := fd.writeLock(); err != nil {
        return 0, err
    }
    defer fd.writeUnlock()
    ...

它使用内部同步。除非您正在编写火星着陆器的代码,否则我认为假设写入是线程安全的是可以的。

https://stackoverflow.com/questions/68132343/

相关文章:

reactjs - 如何使用 zustand 存储查询结果

reactjs - RTK查询 |使来自另一个 API 服务的 API 服务的缓存无效

javascript - 将一组对象组合成一个 OBJECT

javascript - 在大写字母前添加空格,然后将它们转为小写字符串

powershell - 如何从父文件夹重命名 powershell 中的多个文件?

haskell - 如何在 haskell 中正确输入可选参数

r - 查找列中特定值的最大值?

node.js - 如何在带有 Nest.js 的 Node 中分离客户端和服务器应用程序时获取用户

nginx - 如何在 Amazon Linux 2 上安装准确版本的 Nginx?

python - 如何减少 lambda 表达式中辅助函数的使用?