aio_error可以用来轮询aio_write的完成吗?



我们有一些代码沿着

aiocb* aiocbptr = new aiocb;
// populate aiocbptr with info for the write
aio_write( aiocbptr );
// Then do this periodically:
if(aio_error( aiocbptr ) == 0) {
delete aiocbptr;
}

aio_error意味着在写操作完成时返回0,因此我们假设此时可以在aiocbptr上调用delete。

这似乎工作正常,但我们最近开始遇到随机崩溃。有证据表明,在调用delete之后,aiocbptr所指向的数据被修改了。

像这样使用aio_error轮询aio_write完成是否有任何问题?是否有保证aio_error返回0后aiocb不会被修改?

这个变化似乎表明aio_error已经被修复了。我们在x86 RHEL7 linux上运行glibc v 2.17,它早于此修复。

我们尝试在aio_error之外使用aio_suspend,所以一旦aio_error返回0,我们调用aio_suspend,这意味着等待操作完成。但是操作应该已经完成了,所以aio_suspend不应该做任何事情。然而,它似乎修复了崩溃。

是的,我的提交正在修复丢失的内存屏障。例如,使用aio_suspend触发内存屏障,从而也修复了它。

最新更新