论坛首页 综合技术版 C

[Windows]I/O completion ports如何实现?个人推测,寻求标准答案!

浏览 5855 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2007-08-07
再贴一个函数:
00029 {
00030 HANDLE CompletionPort = NULL;
00031 NTSTATUS errCode;
00032 FILE_COMPLETION_INFORMATION CompletionInformation;
00033 IO_STATUS_BLOCK IoStatusBlock;
00034
00035 if ( ExistingCompletionPort == NULL && FileHandle == INVALID_HANDLE_VALUE )
00036 {
00037 SetLastError(ERROR_INVALID_PARAMETER);
00038 return FALSE;
00039 }
00040
00041 if ( ExistingCompletionPort != NULL )
00042 {
00043 CompletionPort = ExistingCompletionPort;
00044 }
00045 else
00046 {
00047
//这个地方就是创建一个内核对象,没错,IOCP是内核对象。
00048 errCode = NtCreateIoCompletion(&CompletionPort,
00049 IO_COMPLETION_ALL_ACCESS,
00050 NULL,//ObjectAttributes
00051 NumberOfConcurrentThreads);
00052
00053 if (!NT_SUCCESS(errCode) )
00054 {
00055 SetLastErrorByStatus (errCode);
00056 return FALSE;
00057 }
00058
00059 }
00060
00061 if ( FileHandle != INVALID_HANDLE_VALUE )
00062 {
00063 CompletionInformation.Port = CompletionPort;
00064 CompletionInformation.Key = (PVOID)CompletionKey;
00065
//从这里我们可以看出,这个调用仅仅是对filehandle进行调用,根本不关iocp的事情。
00066 errCode = NtSetInformationFile(FileHandle,
00067 &IoStatusBlock,
00068 &CompletionInformation,
00069 sizeof(FILE_COMPLETION_INFORMATION),
00070 FileCompletionInformation);
00071
00072 if ( !NT_SUCCESS(errCode) )
00073 {
00074 if ( ExistingCompletionPort == NULL )
00075 {
00076 NtClose(CompletionPort);
00077 }
00078
00079 SetLastErrorByStatus (errCode);
00080 return FALSE;
00081 }
00082 }
00083
00084 return CompletionPort;
00085 }

kqueue在内核和驱动中运用很广,说他是整个任务机制的核心估计也不为过。kqueue为了不产生过多的线程,所以才会限制线程个数。这个整个系统的表现才会比较平稳。
   
0 请登录后投票
时间:2007-08-07
00021 HANDLE
00022 STDCALL
00023 CreateIoCompletionPort(
00024 HANDLE FileHandle,
00025 HANDLE ExistingCompletionPort,
00026 ULONG_PTR CompletionKey,
00027 DWORD NumberOfConcurrentThreads
00028 )
   
0 请登录后投票
论坛首页 综合技术版 C

跳转论坛:
JavaEye推荐
    快速回复 引用上一条消息 (Alt+S)