我们有一些代码,大致如下
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。
这看起来大多数情况下工作正常,但我们最近开始遇到随机崩溃。证据表明,aiocbptr所指的数据在调用delete后被修改。
像这样使用aio_error轮询aio_write完成是否有问题?是否可以保证在aio_error返回0后,aiocb不会被修改?
This change似乎表明一些东西可能已经用aio_error修复了。我们正在x86 RHEL7 Linux上运行glibc v 2.17,它早于此修复。
我们尝试在aio_error之外使用aio_suspend,所以一旦aio_error返回0,我们就调用aio_suspend,这意味着等待操作完成。但是操作应该已经完成,所以aio_suspend应该什么也不做。但是,它似乎修复了崩溃。
1条答案
按热度按时间h43kikqp1#
是的,我的提交是修复一个丢失的内存屏障。使用例如aio_suspend触发内存屏障,从而修复它。