Golang 并发读写文件问题啊啊啊啊

2018 年 2 月 6 日
 Nebell

想着用 Go 写个 mmap + 并发读写文件的小程序,但是加了锁后输出顺序很有问题,俩文件都不一样.

求教怎么并发按顺序写出...

var mmFile, err = mmap.Open(filename)
var size, n = mmFile.Len() / 10, 0
var merr error
var Mutex sync.Mutex
var Wg sync.WaitGroup
var buf = make([]byte, size)
for i := 0; i < mmFile.Len() && io.EOF != merr; i += len(buf) {
	Wg.Add(1)
	go func(off int64) {
		n, merr = mmFile.ReadAt(buf, off)
		Mutex.Lock()
		defer Mutex.Unlock()
		if merr != nil {
			log.Println(merr)
		}
		wFile.Write(buf[:n])
		buf = make([]byte, size)
		Wg.Done()
	}(int64(i))
}

Wg.Wait()
1729 次点击
所在节点    Go 编程语言
2 条回复
goofool
2018 年 2 月 7 日
可以参考 TCP 协议,每块加个 id,最后按 id 顺序写入
Nebell
2018 年 2 月 8 日
用 channel 阻塞实现了😬

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/429007

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX