2

有什么方法可以检查给定文件是否没有 AIO 写入?我在我的 Unix 课程上制作了一个项目,该项目将是一个无上下文(基于 UDP)的国际象棋服务器,所有数据都必须存储在文件中。应用程序将是单进程和单线程的(AIO 功能除外)。我的问题是:

1)玩家一发送一些数据,触发 aio_write 操作到文件,然后进程继续
2)玩家二请求应该从该文件中读取的当前板状态,但如果之前的 aio_write 尚未完成,那么这个文件不是最终的,所以我应该尚未读取但等待 aio_write 结束。
问题是因为它是无上下文的,所以我没有来自 aio_write 调用的 aiocb 结构。

也可能有来自其他游戏(使用不同文件)的 aio_writes 我不需要关心,只有当特定文件当前正在写入时。

4

2 回答 2

2

你为什么要为此使用 AIO?AIO 的目的不是进程之间的同步。这纯粹是为了防止您的进程在由于磁盘负载(读取)或缓存压力(写入)而无法立即满足读取或写入时在内核空间中休眠。read对于象棋游戏这样的小事务,AIO 的行为应该与正常和IO完全相同write:所有操作都将立即完成,尽管开销稍大。

如果您的目标是同步文件访问,您可能会使用fcntl锁定,或者mmap您的文件并在文件中的某处包含互斥锁或信号量。

于 2011-06-12T22:33:08.510 回答
1

它与上下文无关的事实不应阻止您保留一些状态信息。

您可以保留上下文(我的意思是io_context)并重复使用它(发送读取请求并等待它 - io_getevents)。io_submit说它将请求推送到队列中,因此我相信它将保留操作顺序。

或者,(如果您发现io_submit不保留订单)您可以保持足够的状态以知道写入操作处于挂起状态并使用io_getevents. 那么阅读将是安全的。

我希望我没有误读你的问题。

编辑

看来我确实误读了你的问题。您可能正在谈论 POSIX aio(7)。我说的是真正的异步 I/O ( libaio.h)。POSIX aio 通常使用线程来实现(这很糟糕)。

无论哪种方式,如果您可以等待事件(我认为您可以),您仍然可以这样做:保持某种状态以声明写入待处理,并且当有人想要读取时等待写入完成。

于 2011-06-12T22:32:24.283 回答