2015-06-26 22 views
0

我正在開發一個C語言的小軟件,它可以在通知板上讀取和寫入消息。每條消息都是一個以漸進數字命名的.txt文件。編寫/閱讀文件時發生衝突

該軟件是多線程,許多用戶可以執行併發操作。

,用戶可以做的操作是:

  1. 閱讀整篇公告板(所有的.txt文件的內容串聯)
  2. 添加消息(添加一個名爲「id_max ++文件TXT。 「)
  3. 刪除消息。當消息被刪除時,該數字中會有一個洞(例如,「1.txt」,「2.txt」,「4.txt」),永遠不會被填滿。

現在,我想知道是否有一些I/O問題(*)我應該管理(以及如何)或者操作系統(類似Unix的)自己完成。

(*)想要讀取和刪除相同的文件

+0

嚴重的是,使用數據庫,而不是文件系統。另外,你的描述還沒有使我確信你還應該使用多線程。 – o11c

+0

我知道一個數據庫是更簡單,但它是不允許在我的規格... – horcrux

+0

程序員最重要的責任是告訴人們比你爲什麼規範是錯誤的dumber。 – o11c

回答

1

由於您具有類Unix的特性,操作系統將在其他線程打開文件的同時刪除文件:目錄條目立即被刪除,文件本身(inode)在最後關閉時被刪除。

我能看到的唯一問題是在目錄掃描和文件打開之間:競爭條件可能會使文件被刪除。

恕我直言,你只是必須考慮到一個錯誤文件不存在是正常的,只需轉到下一個文件。

您描述的內容並不是很差,因爲它與MH文件夾中的郵件類似,即使涉及鎖定,也可以通過許多不同的進程訪問它。但根據消息的負載和大小,可以考慮使用數據庫。經驗法則(意見):

  • 幾個併發訪問和大文件:繼續使用文件系統
  • 許多訪問和小文件(幾個KO最大):使用數據庫

當然,創建新消息時必須使用受互斥體保護的例程來查找下一個數字(應該將歸功於@ merlin2011用於注意問題)。

你在評論中說你的規格不允許數據庫。與郵件處理的比喻,你可以ALSE使用一個單獨的文件(如traditionnal郵件格式):

  • 一個單一的文件
  • 每個消息前面有一個固定大小的頭說,無論是主動或刪除
  • 讀訪問不需要同步
  • 寫訪問必須同步

這將是一個窮人的數據庫,所有SYN chronization手動完成,但每個線程只有一個文件描述符並保存所有打開和關閉操作。它有意義的地方有很多讀取和很少的寫入或刪除

一個可能的改進是(仍然像郵件閱讀器一樣)建立一個索引與每個消息的偏移量和狀態。索引可能在磁盤上或內存中,具體取決於您的要求。

1

的更簡單的方法是使用一個數據庫類似的SQLite或MySQL,如2的用戶,兩者都提供您可以使用OT達到一致性的交易。如果你仍然想走下去,請繼續閱讀。

這個問題不是IO問題,如果你沒有實現適當的監視器,這是一個併發問題。考慮下面的情況(它不是唯一有問題的情況,但它只是一個例子)。

  1. 用戶1讀取最大ID並將其存儲在局部變量中。
  2. 同時,用戶2讀取相同的最大ID並將其存儲在局部變量中。
  3. 用戶1首先寫入,然後用戶2覆蓋用戶1剛纔寫的內容,因爲它對最大id是什麼有相同的想法。

這個特定的場景可以通過保持當前最大id作爲程序被初始化時被初始化的變量,並保護操作get_and_increment用鎖來解決。但是,這不是唯一有問題的情況,如果您採用這種方法,您需要通過這些方案來推理。