论坛首页 编程语言技术论坛

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

浏览 19156 次
精华帖 (4) :: 良好帖 (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 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics