kenlistian

厚积薄发. 勤为桨,思为帆

   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  73 随笔 :: 4 文章 :: 22 评论 :: 0 Trackbacks

I/O 完成端口可以理解为高性能、高可伸缩性的超级消息队列。若有一个事件驱动的系统,采用完成端口能很达到很高的性能。而且使用起来就会非常简单。

1。 使用 CreateIoCompletionPort API 来创建完成端口。它用于关联内核对象与完成端口的 API。在文件句柄或套接字句柄与完成端口相关联后,在该句柄上完成的所有 I/O 请求将排队
到完成端口队列中。

2。可以采用通知方式排列到完成端口队列中,使用 PostQueuedCompletionStatus API 将自定义的通知排列到完成端口队列中。
    将可以用于向线程发出信号通知事件或插入任何其他自定义外部事件。如,

HRESULT StopThreads()
{
  for (int i = 0; i < THREAD_COUNT; i++)
  {
     PostQueuedCompletionStatus(g_IOPort, 0, 0, NULL);}    
    
     //等待所有线程
     WaitForMultipleObjects(THREAD_COUNT, g_Threads, TRUE, INFINITE);
    
     for (int i = 0; i < THREAD_COUNT; i++)
     {
        CloseHandle(g_Threads[i]);
        g_Threads[i] = NULL;
     }
     return S_OK;
    }
}

而在处理GetQueuedCompletionStatus部分,则收到overlapped = null,

numberOfBytes = 0,key =0,则可以相应作出处理。比如该例中的关闭线程。

UINT __stdcall CompletionThread(PVOID param)
{
   BOOL      result      = FALSE;
   OverlappedBase* overlapped    = NULL;
   ULONG_PTR    key        = 0;
   DWORD      numberOfBytes   = 0;
   for (;;)
   {
       result = GetQueuedCompletionStatus(g_IOPort,
                 &numberOfBytes,
                 &key,
                 (OVERLAPPED**)&overlapped,
                 INFINITE);
       if (result)
       {
          if (numberOfBytes == 0 && key == 0 && !overlapped)
             break;
        ....
       }
      
   }
 
   return 0;

}

 

 

posted on 2006-05-25 23:41 kenlistian 阅读(552) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理