2013-02-08 20 views
0

考虑以下情形:如果在句柄h的异步读取尚未完成之前调用CloseHandle(h)会怎么样?

auto h = CreateFile(...); 
ReadFileEx(h, ...); // Asynchronous read for a large block of data. say, 1GB. 
CloseHandle(h); 
// If the read has not yet finished here, what will happen? Big Bang??? 
+0

未定义的行为。 –

+0

@Alok,你可以把我指向特定的MSDN页面吗? – xmllmx

+0

如果可以,请尝试使用C89标准中描述的文件管理功能,http://linux.die.net/man/3/fopen和http://linux.die.net/man/3/fclose –

回答

3

只要Asyncronous手柄是在调用的时候有效,直到它完成异步操作仍然有效。这是因为Asyncronous文件IO调用对内核中的文件对象持有隐式引用计数。

当异步事件完成时,如果usermode中没有指向该文件的更多句柄,该文件将在内核内部关闭。

请注意,这确实有可见的副作用。特别是,如果您打开了独占读/写文件,发出异步操作,然后关闭句柄,则在异步操作完成之前,文件将无法打开以进行读取/写入操作。

相关问题