2012-11-15 56 views
6

創建一個鎖定的文件我想使用boost::interprocess::file_lock來確保在過程P2之前沒有讀取由進程P1寫入目錄x的文件,直到完成爲止。爲此,我希望P1在寫入文件時用boost::interprocess::file_lock鎖定文件,然後在完成時解鎖它們。然後P2可以跳過(並回到)任何被鎖定的文件。使用boost :: interprocess :: file_lock

我遇到的問題是,看起來boost::interprocess::file_lock只允許您鎖定存在的文件。但是,如果我先創建該文件,然後將其鎖定,那麼就在那裏的競爭條件:

  1. P1創建文件
  2. P2注意到該文件,並開始讀它
  3. P1鎖定該文件
  4. P1寫入一些數據
  5. P2讀取一些數據,到最後,並且只輸出P1的一部分輸出。

所以我想要做的是創建一個文件,並在創建文件時立即鎖定它。有沒有辦法使用boost::interprocess::file_lock來做到這一點?

回答

1

不,但有一個解決方法,只使用一個額外的空文件。

在P2嘗試掃描文件之前,請創建一個名稱爲P1和P2都知道的空文件。在P2開始掃描之前,它將鎖定該空文件並在完成掃描目錄時釋放該鎖(即,當從文件讀入數據時它不應該保持鎖)。在P1創建一個新文件之前,它將鎖定該空文件並在創建新文件後釋放鎖已鎖定。

3

您誤解了boost :: interprocess :: file_lock的用途,當您使用boost :: interprocess :: file_lock test_lock(「my_file」)方法創建file_lock時,您無法保護文件「my_file」免受讀/通過其他進程寫
,你只要聲明你有一個引用文件「my_file」的鎖,如果其他進程也有引用同一文件的鎖,你可以實現這些鎖之間的互斥,但是這些鎖不會不關心文件「my_file」的讀/寫操作,該文件只是一個標誌

0

我想你應該如何能夠避免競態條件如下:

  1. P1創建文件
  2. P2通知文件: a。鎖定它並 b。開始閱讀
  3. P1嘗試鎖定文件,必須等待。
  4. P2讀完,解鎖文件
  5. P1鎖定該文件
  6. P1寫一些數據

讓我知道,如果這是不明確的。

感謝,

莫希特

相關問題