我写了下面的代码。我调用这个方法来使用三个不同的线程写入三个不同的硬盘。其中一个CancelIo调用失败(返回false)。
我假设磁盘是正常的(硬件是正常的)。
这怎么可能呢?
(更换磁盘后,我发现它在另一个磁盘上再次发生。)
public void foo(byte[] bufferToWrite)
{
unsafe
{
NativeOverlapped overlapped = new NativeOverlapped()
{
EventHandle = eventHandle,
OffsetLow = ( int )( s & 0xffffffff ),
OffsetHigh = ( int )( s >> 32 & 0xffffffff )
};
GCHandle gch = GCHandle.Alloc( bufferToWrite, GCHandleType.Pinned );
IntPtr ptr = new IntPtr( ( void* )gch.AddrOfPinnedObject() );
WriteFile( handle, ptr, length, ref bytesWritten, &overlapped );
dwResult = WaitForSingleObject( EventHandle, 30000 );
if(dwResult== TIME_OUT)
{
Debug.Assert( CancelIo ( handle ) );
}
}
} 发布于 2012-05-04 05:47:30
如果没有未完成的IO,CancelIo将失败。您的IO可能会在30001ms之后完成,恰好在事件等待以超时结束之后。
此争用条件无法修复。我知道没有比忽略返回值更好的解决方案了。
https://stackoverflow.com/questions/10439100
复制相似问题