在 Linux 上,openat
系统调用可用于创建文件并测试它们的存在。就 C/C++ 内存模型而言,创建文件并验证其存在会创建同步关系。我需要知道的是这些同步是否都彼此顺序一致。(我当然希望如此,但我实际上并没有在任何地方看到过这个记录。)
例如,给定进程 p1 和 p2,以及路径 A 和 B:
如果 p1 这样做:创建(A),然后创建(B)
p2 这样做:尝试打开(B),然后尝试打开(A)
并且没有其他进程干扰A或B,p2是否有可能成功打开B但找不到A?
如果有所不同,我们可以假设所有操作都在一个文件系统中。
对于所有底层磁盘和多核 CPU 优化,不一定可以确定两个进程之间操作序列的严格顺序。这就是为什么如果存在时间相关行为的可能性时使用信号量的原因。
仅适用于同一目录中的文件。
有6条规则:
锁定强制执行线性化,因此对单个目录的操作是完全有序的。但是,读取访问 (1)、对象创建 (2) 和对象删除 (3) 不会使用比目录锁更广泛的锁,因此无法保证不同目录中目录操作的顺序;不同的观察者可能会看到目录的线性历史以不同的方式交错。