我有一个运行不同命令的控制台程序。我希望能够并行运行程序的多个实例,但是,我想防止特定命令被并行处理。
我想到了一个简单的文件锁定系统。
给定命令“foo”不允许并行运行,这行得通吗?
- 在运行 foo 之前检查文件 .lock_foo_* 是否存在(如果存在,则中止)
- 如果没有,创建文件 .lock_foo_GUID
- 检查 .lock_foo_GUID 是否存在以及是否不存在其他 .lock_foo_* 文件
如果有另一个 .lock_foo_* 文件,这意味着另一个实例同时创建了一个,我们中止并删除我们的锁定文件。
我想知道是否有任何竞争条件,这是否是处理它的正确方法?
更新
我认为它实际上比最初预期的要容易(至少在 Windows 上)。我认为 thb 的回答让我走上了正确的道路。
我认为这样的事情应该有效
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;
}
操作系统将确保仅在文件尚不存在时才创建该文件,否则将引发异常。所以这个方法应该是安全的。不幸的是,这在 UNIX 上不起作用。