有没有办法检查是否没有AIO写入给定文件?我在我的Unix课程上制作了一个项目,它将是一个无上下文(基于UDP)的国际象棋服务器,所有数据都必须存储在文件中。应用程序将是单个进程和单线程(期望AIO功能)。我的问题是:
1)Player One发送一些数据,触发aio_write操作到文件,然后进程进入
2)播放器2请求当前板状态应该从该文件中读取,但如果先前的aio_write尚未完成,则该文件不是最终的,因此我不应该读取但是等待aio_write结束。
问题是因为它是无上下文的,所以我没有aio_write调用的aiocb结构。
也可能有其他游戏(使用不同文件)的aio_writes,我不需要关心,只有特定文件当前正在写入。
答案 0 :(得分:2)
为什么要使用AIO呢? AIO的目的不是进程之间的同步。当由于磁盘加载(读取)或缓存压力(写入)而无法立即满足读取或写入时,这纯粹是为了防止进程在内核空间中休眠。在像国际象棋游戏这样的小型交易中,AIO应该与普通read
和write
IO完全相同:所有操作都会立即完成,尽管开销会略有增加。
如果您的目标是同步文件访问权限,则可以使用fcntl
锁定或mmap
您的文件,并在文件中的某处包含互斥锁或信号量。
答案 1 :(得分:1)
它没有上下文的事实不应该阻止你保留一些状态信息。
您可以保留上下文(我的意思是 io_context
)并重新使用它(发送读取请求并等待它 - io_getevents
)。 io_submit
表示它会将请求推送到队列中,所以我相信它会保留操作的顺序。
或者,(如果您发现io_submit
没有保留订单),您可以保持足够的状态以知道写操作正在等待并等待io_getevents
。 然后阅读将是安全的。
我希望我没有误解你的问题。
修改强>
我似乎误读了您的问题。您可能正在谈论POSIX aio(7)
。我在谈论真正的异步I / O(libaio.h
)。 POSIX aio通常使用线程实现(这种方式很糟糕)。
无论哪种方式,如果你可以等待事件(我认为你可以),你仍然可以这样做:保持一些状态来声明写入处于挂起状态,当有人想要读取等待写入完成时。