O_SYNC是指原子操作吗?

时间:2012-10-30 03:53:20

标签: file unix atomic

是否使用O_SYNC原子的I / O函数?例如:

fd = open("user.data", O_RDONLY | O_SYNC);
pread(fd, &buf, sizeof(User), 100*sizeof(User));

在这种情况下,pread是原子的吗?注意:没有任何文件锁定舔flockfcntl

1 个答案:

答案 0 :(得分:0)

Atomic相对于什么?

关于buf?

然后不会,操作系统会以串行方式将大多数数据复制到您的程序中。其他线程一次可能会或可能不会看到更新的块。如果要保护对buf的访问,则需要使用信号量或互斥量来序列化对它的访问。这可能适用于非常小的读取,但您至少要做100字节,在任何情况下都不应该依赖它。

关于文件描述符?

多个线程可以在同一文件描述符上同时使用

pread()。我认为这可能是它的设计原因。当然,每个线程都需要自己的缓冲区来保存数据。

关于磁盘?

O_SYNC对于读取并不十分有用。当与写入一起使用时,O_SYNC意味着在调用结束时,缓冲区中的数据现在被刷新。这可能意味着它存在于磁盘上,或者可能意味着它已经通过连接刷新。对于读取,您可能需要使用O_RSYNC。 O_RSYNC将强制读取阻止调用,直到完成所需的元数据更新。这方面的一个例子是记录了“访问时间”的文件系统。