File 这个文件锁定机制会工作吗?或者它们的竞争条件会是什么?

File 这个文件锁定机制会工作吗?或者它们的竞争条件会是什么?,file,console,locking,File,Console,Locking,我有一个运行不同命令的控制台程序。我希望能够并行运行程序的多个实例,但是,我希望防止并行处理特定命令 我想到了一个简单的文件锁定系统 给定的命令foo不允许并行运行,这样行吗 在运行foo之前,请检查file.lock\u foo\ux是否存在。如果存在,请中止 如果没有,请创建文件.lock\u foo\u GUID 检查.lock\u foo\u GUID是否存在,以及是否不存在其他.lock\u foo\u*文件 如果有另一个.lock_foo_*文件,这意味着另一个实例同时创建了一个,我

我有一个运行不同命令的控制台程序。我希望能够并行运行程序的多个实例,但是,我希望防止并行处理特定命令

我想到了一个简单的文件锁定系统

给定的命令foo不允许并行运行,这样行吗

在运行foo之前,请检查file.lock\u foo\ux是否存在。如果存在,请中止 如果没有,请创建文件.lock\u foo\u GUID 检查.lock\u foo\u GUID是否存在,以及是否不存在其他.lock\u foo\u*文件 如果有另一个.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上不起作用。

您的逻辑看起来相当不错。但是,如果您感兴趣,那么已经有多个命令行实用程序可以执行您想要的操作,例如lockfile和flock

试试Man1锁文件。我想那个主页会简明扼要地回答你的问题

另一方面,如果您需要或更愿意自己实现这一点,那么您建议的方法几乎是正确的,但必须偶尔失败。这是令人沮丧的,但是这是你想要做的事情的固有特性。原因是在1检查另一个进程是否已锁定资源和2锁定资源之间有一个短暂的间隔。如果在这个短暂的时间间隔内,另一个进程应该锁定资源,会发生什么情况

我们需要的是一个原子操作,它以某种方式作为一个单一的、不间断的步骤进行检查和锁定。幸运的是,现代CPU提供了这样的原子操作,而现代操作系统内核将它们公开,这样您就可以真正可靠地做您想做的事情


如果您对此感兴趣,那么您可以查阅Microsoft的开发文档以获取和。

谢谢您的回答。这将是我们正在开发的基于.NET的某种业务外壳的一部分。所以,我把事情简单化了。尽管如此,还是要感谢您的推荐。它可能会解决您的问题,也可能不会解决您的问题,但我已经在我的答案中添加了一些其他特定于Microsoft的材料。无论如何,祝你好运!再次感谢你。我看了一下锁定文件的东西,但似乎这只是锁定文件的一部分。起初,我认为我解决了您在步骤3中所描述的问题,在步骤3中,我在创建后再次检查我的锁文件是否是唯一创建的锁文件。然而,现在我想起来,这可能更容易。至少在Windows上,我可以创建一个没有GUID的.lock\u foo文件,而不需要覆盖权限。如果成功了,我就是锁的主人,如果失败了,我不是。