代码之家  ›  专栏  ›  技术社区  ›  Luc Touraille

如何同步访问NAS上文件的两个进程?

  •  4
  • Luc Touraille  · 技术社区  · 17 年前

    这里有一件事:我有两个应用程序,用C++编写,在两台机器上运行,操作系统不同(一个Linux和一个Windows)。其中一个进程负责更新NAS(网络连接存储)上的XML文件,而另一个进程则读取该文件。

    5 回复  |  直到 17 年前
        1
  •  9
  •   Wolfwyrd    17 年前

    编辑 :要处理注释,可以实现双重检查锁定类型模式。让读写器都有一个锁定文件,并在工作前进行双重检查,例如:

    写入程序:检查读锁文件,创建写锁文件,检查读锁文件,如果存在,删除写锁文件并中止。

    这将停止进程之间的相互践踏,但可能会出现一种潜在的争用情况,即您可能同时检查、创建和重新检查两个进程,尽管这不会导致数据以不一致的状态读取,但会导致读取和写入进程因指定的延迟而中止

        2
  •  5
  •   Luc Touraille    17 年前

    谢谢大家的回答。

    最后,我们设法解决了问题,不是通过使用操作系统的锁定命令(因为我们不确定它们是否会正确传播到NAS头的操作系统),而是通过创建锁定目录而不是锁定文件。目录创建是一个原子操作,如果文件夹已经存在,则返回一个错误值。因此,我们不必在获取锁之前检查它是否存在,这两个操作都是在一个步骤中完成的。

        3
  •  2
  •   Loki Astari    17 年前

    好的,您需要某种形式的锁定机制来控制访问。

    大多数*nix文件系统都提供这种功能。我怀疑它在Windows文件系统上也可用(因为perl使用这种机制),但它可能有另一个名称。

    看看羊群()。
    这是一种文件锁定机制。它是一个建议锁,因此实际上不会锁定文件并阻止使用,但它提供了一种标记文件的机制。如果两个应用程序都使用该机制,则可以控制对文件的访问。

    flock()提供共享锁(或读锁)和独占锁(或写锁)。flock将阻塞线程(以非忙方式),直到用户解锁文件(它还提供非阻塞检查,以便您可以在等待时执行其他操作)。

    查看手册第2节中的flock。

    int     flock(int fd, int operation);
    
    Flock() applies or removes an advisory lock on the file associated with the file
    descriptor fd.  A lock is applied by specifying an operation parameter that is
    one of LOCK_SH or LOCK_EX with the optional addition of LOCK_NB.  To unlock an
    existing lock operation should be LOCK_UN.
    
        4
  •  1
  •   David Holm    17 年前

    fcntl(2) 锁定文件。检查问题 D10 Linux NFS FAQ . 我对windows API几乎没有经验,但据我所知,他们有很好的POSIX支持,所以只要他们支持POSIX.1-2001,您就应该能够使用fcntl。

    如果您使用不同的协议(即AFS或SMB)访问文件,您是否可以设置一个简单的同步服务器,通过IPC接口管理锁?

        5
  •  1
  •   James Anderson    17 年前

    是否可以从文件切换到数据库?

    这种类型的并发性是DBMS能够很好地管理的。它不需要昂贵或难以安装。MySql、Postgress或JavaDB都可以优雅地处理这一问题,而且成本很低或没有成本。

    如果数据库选项失败,我将让写入过程写入一个“隐藏”文件名,如“.updateinprogress.xml”,并在更新完成后重命名该文件。在大多数系统中,“mv”或“ren”是一个原子操作,因此读取过程要么拾取旧文件,要么拾取新文件,但决不能拾取半写文件。