我有一個控制檯程序運行不同的命令。我希望能夠並行運行多個程序實例,但是我想阻止並行處理特定命令。這個文件鎖定機制會工作還是會成爲競爭條件?
我想到了一個簡單的文件鎖定系統。
給定的命令「foo」不允許並行運行,這是否行得通?
- 運行foo的檢查,如果文件.lock_foo_ *存在(如果有的話,中止)
- 如果沒有,創建文件.lock_foo_GUID
- 檢查是否存在.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上不起作用。
謝謝你的回答。這將成爲我們正在開發的基於.NET的某種業務外殼的一部分。所以,我只是簡單化了一些東西。不過,謝謝你的參考。 – Christoph
它可能會也可能不會解決你的問題,但我已經在我的答案中添加了一些額外的,特定於Microsoft的材料。無論如何,祝你好運! – thb
再次感謝您。我查看了LockFile的東西,但似乎只鎖定了一部分文件。最初我以爲我解決了第3步中勾畫的問題,如果我的鎖定文件是唯一創建的鎖定文件,我會在創建後再次檢查*。但是,現在我想到了,它可能會更容易。至少在Windows上,我可以創建一個.lock_foo文件(不帶GUID),而不會覆蓋權限。如果它是成功的我是鎖擁有者,如果它失敗,我不是。 – Christoph