2012-06-05 13 views
0

我有一個控制檯程序運行不同的命令。我希望能夠並行運行多個程序實例,但是我想阻止並行處理特定命令。這個文件鎖定機制會工作還是會成爲競爭條件?

我想到了一個簡單的文件鎖定系統。

給定的命令「foo」不允許並行運行,這是否行得通?

  1. 運行foo的檢查,如果文件.lock_foo_ *存在(如果有的話,中止)
  2. 如果沒有,創建文件.lock_foo_GUID
  3. 檢查是否存在.lock_foo_GUID如果沒有其他.lock_foo_ *文件存在

如果有另一個.lock_foo_ *文件,這意味着另一個實例同時創建一個實例,我們中止並刪除我們的鎖定文件。

我不知道是否有任何競爭條件,如果這是正確的方式來處理它?

UPDATE

我認爲這是比最初預期(至少在Windows上)其實更容易。我想這個答案讓我走上正軌。

我覺得這樣的事情應該工作

public bool CreateLock(string fileName){ 
    try{ 
     File.Open(string.Format(".lock_{0}",fileName), FileMode.Create, FileAccess.ReadWrite, FileShare.None); 
     } 
     catch (Exception exception){ 
      return false; 
     } 
     return true; 
} 

OS將確保該文件將,如果不存在,就只能創建,否則將引發異常。所以這個方法應該是安全的。不幸的是,這在UNIX上不起作用。

回答

0

你的邏輯看起來不錯。但是,如果您感興趣,則已有多個命令行實用程序來執行您想要的操作,例如lockfileflock

嘗試man 1 lockfile。我懷疑那個manpage會簡潔地回答你的問題。另一方面,如果你需要或者更願意實現這一點,你自己,那麼你建議的方法幾乎是正確的,但必須是零星的,偶爾會失敗。這是令人沮喪的,但這是你嘗試做的事情所固有的。原因是(1)檢查另一個進程是否鎖定了資源和(2)鎖定資源之間存在一個短暫的間隔。如果在這個短時間間隔內,另一個進程應該鎖定資源,會發生什麼情況?

需要的是一個原子操作,它以某種方式檢查和鎖定爲一個單一的不可中斷的步驟。幸運的是,現代CPU提供這樣的原子操作,而現代操作系統內核也暴露出它們,所以你可以確實可靠地做你想做的事情。

如果您感興趣,那麼您可以參考微軟的開發文檔LockFileLockFileEx

+0

謝謝你的回答。這將成爲我們正在開發的基於.NET的某種業務外殼的一部分。所以,我只是簡單化了一些東西。不過,謝謝你的參考。 – Christoph

+0

它可能會也可能不會解決你的問題,但我已經在我的答案中添加了一些額外的,特定於Microsoft的材料。無論如何,祝你好運! – thb

+0

再次感謝您。我查看了LockFile的東西,但似乎只鎖定了一部分文件。最初我以爲我解決了第3步中勾畫的問題,如果我的鎖定文件是唯一創建的鎖定文件,我會在創建後再次檢查*。但是,現在我想到了,它可能會更容易。至少在Windows上,我可以創建一個.lock_foo文件(不帶GUID),而不會覆蓋權限。如果它是成功的我是鎖擁有者,如果它失敗,我不是。 – Christoph