2 回答

TA貢獻1828條經(jīng)驗 獲得超13個贊
控制并發(fā)訪問的一種簡單方法是通過服務(wù) goroutine,從通道接收消息。該 goroutine 將擁有對該文件的唯一訪問權(quán)限。因此,訪問將是順序的,沒有任何競爭問題。
通道在交錯請求方面做得很好??蛻舳藢懭胪ǖ蓝皇侵苯訉懭胛募?。頻道上的消息會自動為您交錯。
與簡單地使用互斥鎖相比,這種方法的好處在于您可以開始將程序視為微服務(wù)的集合。這是 CSP 方式,可以輕松地從較小的組件組合大型系統(tǒng)。

TA貢獻1797條經(jīng)驗 獲得超4個贊
有很多方法可以控制并發(fā)訪問。最簡單的方法是使用Mutex:
var mu sync.Mutex
func WriteToFile( i int, f *os.File, w *sync.WaitGroup ){
mu.Lock()
defer mu.Unlock()
// etc...
}
至于為什么你沒有看到問題,Go 使用操作系統(tǒng)調(diào)用來實現(xiàn)文件訪問,并且這些系統(tǒng)調(diào)用是線程安全的(強調(diào)):
根據(jù) POSIX.1-2008/SUSv4 Section XSI 2.9.7(“與常規(guī)文件操作的線程交互”):
在 POSIX.1-2008 中指定的效果中,當它們對常規(guī)文件或符號鏈接進行操作時,以下所有函數(shù)都應(yīng)該是原子的: ...
隨后列出的 API 包括 write() 和 writev(2)??缇€程(和進程)應(yīng)該是原子的,其中包括文件偏移的更新。但是,在 3.14 版之前的 Linux 上,情況并非如此:如果共享打開文件描述(請參閱 open(2))的兩個進程同時執(zhí)行 write()(或 writev(2)),則 I /O 操作在更新文件偏移量方面不是原子的,因此兩個進程輸出的數(shù)據(jù)塊可能(錯誤地)重疊。 此問題已在 Linux 3.14 中修復(fù)。
我仍然會使用鎖,因為 Go 代碼不是自動線程安全的。(兩個 goroutine 修改同一個變量會導(dǎo)致奇怪的行為)
- 2 回答
- 0 關(guān)注
- 241 瀏覽
添加回答
舉報