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

是否有可能以避免在它的被修改的同时该文件的读取这两个过程同步?

有帮助吗?

解决方案

您可以读取文件之前创建创建你写之前,等待再写入和删除完成服务器上的锁文件,有令牌读取过程检查。

修改:为了解决这个意见,你可以实现双重检查锁定型图案。同时拥有读写器有一个锁定文件,并仔细检查你做的工作之前,是这样的:

读者:检查是否有写锁文件,创建读取锁定文件,检查是否有写锁文件,如果存在,删除已读文件,并中止

作家:检查是否有读锁文件,创建写锁文件,检查是否有读锁文件,如果存在,删除写锁文件,并中止

这将停止你的流程践踏对方,但要读,虽然这不会造成数据的你可能有两种工艺检查,最终创建然后同时复检,可能会出现潜在的竞争条件不一致的状态,但会导致的读写过程中止你指定的延迟

其他提示

感谢大家的答案。

最后,我们成功地解决我们的问题,而不是通过使用OS锁定命令(因为我们不知道他们会正确地传播到NAS头的操作系统),但通过创建锁定目录,而不是锁定文件。目录的创建是一个原子操作,如果文件夹中已经存在返回错误值。因此,我们没有获得它,这两个操作都在一个单一步骤中进行之前检查锁存在。

OK你需要某种形式的锁定机制来控制访问的。

大多数* nix文件系统可提供此。我怀疑它也可以在Windows文件系统(因为这个机制通常被Perl),但它可能有另外一个名字。

看一看羊群()。结果 这是一个文件锁定机制。这是一个咨询锁所以它实际上并没有锁定文件,防止使用,但它提供了一个机制,用于标记文件。如果这两个应用程序使用机构然后可以控制访问该文件。

群()提供两个共享锁(或读取锁定)和独占锁(或写锁定)。羊群会阻止你的线程(在非繁忙方式),直到该文件已被用户解锁(它也提供非阻塞检查,这样你就可以做其他的事情在等待)。

查核羊群在手册页的第2部分

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.

如果该文件驻留在NFS共享可以使用的fcntl(2)锁定文件。检查问题的 D10 的在的Linux NFS常见问题解答。我有Windows APIs的经验非常少,但是从我听说他们有很好的POSIX支持,所以你应该可以,只要他们支持POSIX.1-2001使用的fcntl。

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

这将有可能从文件切换到一个数据库?

本型并发性的是,数据库管理系统管理非常好东西。它不需要昂贵或难以安装。 MySQL中,Postgress或JavaDB之外将全部在很少或根本没有成本很好地处理这一点。

未能通过数据库选项我会写程序写像“.updateinprogress.xml”一个“隐藏”的文件名和重命名文件的更新完成时。在大多数系统“MV”或“仁”是一个原子操作,以便读出处理或者拿起HTE旧文件或较新的文件,但从来没有写入一个半。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top