0

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

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

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

4

1 回答 1

0

原子就什么?

关于buf?

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

关于文件描述符?

pread() 可以在同一个文件描述符上同时被多个线程使用。我想这可能就是它被设计的原因。当然,每个线程都需要自己的缓冲区来保存数据。

关于磁盘?

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

于 2012-12-09T06:10:33.577 回答