如果一个进程执行大小(和alignment)S(例如8KB)的write(),那么另一个进程是否可能进行读取(也是大小和alignmentS以及相同的文件)新数据?
写入过程为每个数据块添加校验和,我想知道是否可以使用读取过程来validation背景中的校验和。 如果读者可以看到一个部分写,那么它会错误地指示腐败。
什么标准或文件适用于此? 有没有一种便携的方式来避免这里的问题,最好不要引入大量的locking?
当一个函数被保证完成而没有任何其他进程/线程/任何事物处于半完成状态时,它被认为是原子的 。 它有或没有发生,没有任何分歧。 虽然我不能与Windows通话,但在POSIX中很少有文件操作(这是Linux / BSD / etc试图坚持的操作),这些文件操作是保证原子性的。 读写不保证是原子的 。
虽然写2个字节的文件是不太可能的,而另一个进程只能看到其中的一个字节,如果运气不好,你的写操作会跨越内存中的两个不同的页面,VM系统必须做一些准备工作页面中,有可能在第二个进程中看到一个字节而没有另一个字节。 通常情况下,如果文件中的页面对齐,它们将在内存中,但是你不能依赖于它。
下面是一个由POSIX中的原子组成的列表 ,这个列表很短,我不能保证它是真实的。 (我不明白为什么unlink没有列出,例如)。
我也提醒你不要测试什么似乎工作和运行,当你开始通过网络文件系统访问文件的时候(Unix上的NFS或者Windows上的SMB挂载)很多东西在没有更长了。
如果您希望在第一个进程正在写入文件时想要第二个进程计算校验和,则可能需要在这两者之间打开一个管道,并让第一个进程将管道中的所有内容都写入校验和过程。 这可能比处理锁定更快。