检查aio_write是否完成

标签 c unix synchronization aio

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

1)玩家一发送一些数据,触发aio_write操作到文件,并且该过程进行
2)玩家二请求应从该文件读取的当前棋盘状态,但如果先前的 aio_write 尚未完成,则该文件不是最终文件,因此我不应该读取,而是等待 aio_write 结束。
问题是,因为它是上下文无关的,所以我没有来自 aio_write 调用的 aiocb 结构。

此外,还可能存在来自其他游戏(使用不同文件)的 aio_writes,我不需要关心这些内容,仅当特定文件当前正在写入时。

最佳答案

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

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

关于检查aio_write是否完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6325071/

相关文章:

c - (gcc)go 中的打包结构

python - 用于 SWIG、Python 的 C 函数错误代码的 %typemap 和 %exception

java - 在Java中,如果我的集合是只读的,我是否需要声明我的集合是同步的?

linux - a.out被ELF文件格式取代?

linux - jboss服务器未连接

c++ - 在嵌入式设备上序列化和同步数据

ios - 通过 Wifi 网络连接 iOS 一组 iOS 设备

C 函数中以逗号分隔的返回参数

C 如何使用 EOF 跳出循环?

shell - 使用自定义排序顺序对 Unix 中的字母数字字符串进行排序