我們有兩個執行緒,一個用于寫入,另一個用于洗掉,還有一個共享目錄,其中一個執行緒創建一個新檔案并寫入一些訊息,但另一個執行緒延遲掃描此目錄并從新檔案中讀取訊息并將其洗掉。
所以基本上我明白它應該是同步的,因為如果一個人創建了檔案但還沒有寫入并且另一個執行緒使用這個空檔案并將其洗掉,那么我們就會遇到問題。
但是,例如,如果有 4kb,創建或寫入需要多長時間?
主要問題我們可以避免同步,或者在這種情況下,同步應該是?
uj5u.com熱心網友回復:
如果創建了該檔案但尚未寫入并且另一個執行緒獲取此空檔案并將其洗掉,那么我們將遇到問題
此問題的解決方案是使檔案永遠不會不完整或無效。
檔案創建和檔案填充不是原子序列。為了使讀者具有原子性,作者應該:
- 在目標目錄中創建一個臨時檔案,例如
<filename>~. 因此命名的臨時檔案(以 結尾~)不得被任何其他行程讀取。當有多個競爭作者時,將 (pid或tid) 和 (tsc或nanoseconds since epoch) 的組合放入臨時檔案名中,例如<filename>.<pid>.<nsec>~. 在 Linux 上,您可以交替使用mkstemp為您創建一個獨特的檔案。 - 填充
<filename>~. - 重命名
<filename>~為<filename>. 在 Linux 上renameat2是一個原子檔案系統操作,RENAME_NOREPLACE當<filename>已經存在時它會失敗,以便多個作者可以檢測到這種情況并采取相應的行動。std::rename不幸的是,當<filename>已經存在時不需要任何特定的行為。
這樣當<filename>存在時它是完整和有效的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/349070.html
