异步文件操作的疑惑,望高手解答
一个基于iocp的异步文件操作测试
文件是这样创建的:
m_File=CreateFile("c:\abc.DAT",GENERIC_READ ¦GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_FLAG_OVERLAPPED,NULL);
写函数定义:
void Write(char* Buffer,int WriteCount,int WriteOff)
{
LPOVERLAPPED OL;
memset(&OL,0,sizeof(LPOVERLAPPED));
OL.Offset=WriteOff;
DWORD nWritten;
if(!WriteFile(m_File,Buffer, WriteCount, &nWritten,(LPOVERLAPPED)&OL))
{
DWORD Error=GetLastError();
if(Error!=ERROR_IO_PENDING && Error!=ERROR_HANDLE_EOF)
throw CError(FormatErrorMessage(Error));
}
}
测试代码1:
char *Buffer=new char[2000000];
for(int n=0;n <10;n++)
{
int off=n*2000000;
Write(Buffer+off,2000000,off);
}
测试代码2:
char *Buffer=new char[2000000];
for(int n=0;n <10000;n++)
{
int off=n*2000;
Write(Buffer+off,2000,off);
}
运行测试出现的现象:
对新建的未执行过写入操作的文件,测试代码1是异步写入的,对执行过写入操作即文件长度>0的文件却是同步写入的。测试代码2始终都是异步执行的。
进一步测试发现是同步还是异步取决于单次写入的字节数,写入的字节数小就是异步的,字节数大到一定程度就变成同步了。
请问是怎么回事?