如何解决检查aio_write是否完成
| 有什么方法可以检查是否没有AIO写入给定文件?我正在我的Unix课程上制作一个项目,该项目将是无上下文(基于UDP)的象棋服务器,所有数据都必须存储在文件中。应用程序将是单进程和单线程的(需要AIO功能)。我的问题是: 1)播放器一发送一些触发aio_write操作的数据到文件,然后过程进行 2)播放器二请求应从该文件读取当前板状态,但是如果先前的aio_write还没有完成,则该文件不是最终文件,因此我不应该阅读,但要等待aio_write结束。 问题是,因为它是上下文无关的,所以我没有aio_write调用的aiocb结构。 也可能会有其他游戏(它们使用不同的文件)的aio_writes,我不需要关心,只有当前正在写入特定文件时才可以。解决方法
为什么要为此使用AIO? AIO的目的不是进程之间的同步。纯粹是为了防止由于磁盘负载(读取)或缓存压力(写入)而无法立即满足读取或写入操作时,您的进程在内核空间中进入休眠状态。在象棋游戏这样的小事务上,AIO的行为应与正常的“ 0”和“ 1” IO完全相同:所有操作将立即完成,尽管开销会适度增加。
如果您的目标是同步文件访问,则可以使用
fcntl
锁定或mmap
文件,并在文件中的某个位置包含互斥量或信号量。
, 它的上下文无关的事实不应阻止您保留某些状态信息。
您可以保留上下文(我的意思是io_context
)并重新使用它(发送读取请求并等待它-io_getevents
)。 “ 6”表示将请求推送到队列中,因此我相信它将保留操作顺序。
另外,(如果您发现io_submit
不会保留顺序),您可以保持足够的状态来知道写操作正在等待,然后使用io_getevents
等待。这样阅读会很安全。
希望我不会误解您的问题。
编辑
看来我确实读错了你的问题。您可能在谈论POSIXaio(7)
。我说的是真正的异步I / O(libaio.h
)。 POSIX aio通常是使用线程(很烂)来实现的。
无论哪种方式,如果您可以等待事件(我认为可以),那么您仍然可以这样做:保持某种状态以声明写入未决,并且当有人想要读取时等待写入完成。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。