完成端口

来源:完成端口详解

目标:使得CPU满负荷工作

步骤:

  1. 创建一个完成端口
  2. 获取系统中CPU数量
  3. 根据2建立对应的worker线程(建议worker数量=CPU数量*2:同一个CPU核心上,一个线程处于Sleep()/WaitForSingleObject(),另一个线程可以代替这个线程执行)
  4. 创建一个用于监听的socket
  5. 绑定到完成端口
  6. 开始在指定端口上监听连接请求
  7. 在监听socket上投递AcceptEx请求
  8. worker线程工作
    1. 使用GetQueuedCompletionStatus()监控完成端口 (让worker线程进入不占用CPU的状态,直到出现需要处理的网络操作或超出等待时间为止)
    2. 收到Accept/Recv通知,_DoAccept()/_DoRecv()
  9. 关闭完成端口
    1. PostQueuedCompletionStatus() //,函数作用:将一个I/O数据包发送到一个I/O完成端口。提供了一种方式与线程池中的所有线程进行通信
    2. CloseHandle()

优势:

  1. 使用AcceptEx:在与客户端通信之前,无论是否有客户端接入,AcceptEx都预先建立好socket
  2. 将IO操作从手动变为自动:不仅能自动通知数据可读写,还自动进行数据收发工作
  3. 一个连接对应一个线程,避免了大量线程切换

猜你喜欢

转载自www.cnblogs.com/tomatokely/p/8980462.html