当两个 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/