登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-07 15:57:37 432浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《golang 中 os.File.Write() 线程安全吗?》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

当两个 goroutines 通过 os.file.write() 同时写入文件时,线程安全吗?

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

根据这个问题,多个进程同时写入同一个文件是否安全? [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()
    ...

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

到这里,我们也就讲完了《golang 中 os.File.Write() 线程安全吗?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>