我正在构建一个系统,其中多个从属进程通过unix域套接字进行通信,并且它们同时写入同一文件.我从未研究过文件系统或这个特定的文件系统(ext4),但感觉这里可能存在一些危险.
每个进程写入输出文件的不相交子集(即,正在写入的块中没有重叠).例如,P1仅写入文件的前50%,P2仅写入第二个50%.或者P1在P2写入偶数块时可能只写入奇数块.
拥有P1和P2(在不同的线程上同时运行)写入同一文件而不使用任何锁定是否安全?换句话说,文件系统是否隐式强加了某种锁定?
注意:遗憾的是,我不能随意输出多个文件并在以后加入.
注意:自发布此问题以来,我的阅读与下面仅发布的答案不一致.我读过的所有内容都表明我想做的事情很好,而下面的受访者坚持认为我所做的是不安全的,但我无法辨别所描述的危险.
下面的代码不会引发数据竞争
package main
import (
"fmt"
"os"
"strings"
)
func main() {
x := strings.Repeat(" ", 1024)
go func() {
for {
fmt.Fprintf(os.Stdout, x+"aa\n")
}
}()
go func() {
for {
fmt.Fprintf(os.Stdout, x+"bb\n")
}
}()
go func() {
for {
fmt.Fprintf(os.Stdout, x+"cc\n")
}
}()
go func() {
for {
fmt.Fprintf(os.Stdout, x+"dd\n")
}
}()
<-make(chan bool)
}
Run Code Online (Sandbox Code Playgroud)
我尝试了多种长度的数据,变体https://play.golang.org/p/29Cnwqj5K30
这篇文章说它不是TS。
这封邮件并没有真正回答问题,或者我没有理解。
os和fmt 的包文档对此没有太多提及。我承认我没有挖掘这两个包的源代码来找到进一步的解释,它们对我来说太复杂了。
有哪些建议和参考?