|
|
1
9
编辑 :要处理注释,可以实现双重检查锁定类型模式。让读写器都有一个锁定文件,并在工作前进行双重检查,例如:
写入程序:检查读锁文件,创建写锁文件,检查读锁文件,如果存在,删除写锁文件并中止。 这将停止进程之间的相互践踏,但可能会出现一种潜在的争用情况,即您可能同时检查、创建和重新检查两个进程,尽管这不会导致数据以不一致的状态读取,但会导致读取和写入进程因指定的延迟而中止 |
|
|
2
5
谢谢大家的回答。 最后,我们设法解决了问题,不是通过使用操作系统的锁定命令(因为我们不确定它们是否会正确传播到NAS头的操作系统),而是通过创建锁定目录而不是锁定文件。目录创建是一个原子操作,如果文件夹已经存在,则返回一个错误值。因此,我们不必在获取锁之前检查它是否存在,这两个操作都是在一个步骤中完成的。 |
|
3
2
好的,您需要某种形式的锁定机制来控制访问。 大多数*nix文件系统都提供这种功能。我怀疑它在Windows文件系统上也可用(因为perl使用这种机制),但它可能有另一个名称。
看看羊群()。
flock()提供共享锁(或读锁)和独占锁(或写锁)。flock将阻塞线程(以非忙方式),直到用户解锁文件(它还提供非阻塞检查,以便您可以在等待时执行其他操作)。 查看手册第2节中的flock。
|
|
|
4
1
fcntl(2) 锁定文件。检查问题 D10 在 Linux NFS FAQ . 我对windows API几乎没有经验,但据我所知,他们有很好的POSIX支持,所以只要他们支持POSIX.1-2001,您就应该能够使用fcntl。 如果您使用不同的协议(即AFS或SMB)访问文件,您是否可以设置一个简单的同步服务器,通过IPC接口管理锁? |
|
|
5
1
是否可以从文件切换到数据库? 这种类型的并发性是DBMS能够很好地管理的。它不需要昂贵或难以安装。MySql、Postgress或JavaDB都可以优雅地处理这一问题,而且成本很低或没有成本。 如果数据库选项失败,我将让写入过程写入一个“隐藏”文件名,如“.updateinprogress.xml”,并在更新完成后重命名该文件。在大多数系统中,“mv”或“ren”是一个原子操作,因此读取过程要么拾取旧文件,要么拾取新文件,但决不能拾取半写文件。 |
|
|
fiedel · 为什么互斥锁可以被两个线程锁定? 3 年前 |
|
|
da cheng · 在c++11中使用条件变量使程序陷入死锁 8 年前 |
|
|
Eunjeong Choi · 为什么此代码返回意外结果?(条件变量) 8 年前 |
|
|
Razonixx · 从线程内增加全局计数器变量,而不必等待每个线程 8 年前 |
|
|
Administrator · c#-等待完成2个线程中的1个 8 年前 |