完成端口模型简介(zz)

抽象出一个完成端口大概的处理流程:
1:创建一个完成端口。
2:创建一个线程A。
3:A线程循环调用GetQueuedCompletionStatus()函数来得到IO操作结果,这个函数是个阻塞函数。
4:主线程循环里调用accept等待客户端连接上来。 
5:主线程里accept返回新连接建立以后,把这个新的套接字句柄用CreateIoCompletionPort关联到完成端口,然后发出一个异步的WSASend或者WSARecv调用,因为是异步函数,WSASend/WSARecv会马上返回,实际的发送或者接收数据的操作由WINDOWS系统去做。
6:主线程继续下一次循环,阻塞在accept这里等待客户端连接。
7:WINDOWS系统完成WSASend或者WSArecv的操作,把结果发到完成端口。
8:A线程里的GetQueuedCompletionStatus()马上返回,并从完成端口取得刚完成的WSASend/WSARecv的结果。
9:在A线程里对这些数据进行处理(如果处理过程很耗时,需要新开线程处理),然后接着发出WSASend/WSARecv,并继续下一次循环阻塞在GetQueuedCompletionStatus()这里。

归根到底概括完成端口模型一句话:
我们不停地发出异步的WSASend/WSARecv IO操作,具体的IO处理过程由WINDOWS系统完成,WINDOWS系统完成实际的IO处理后,把结果送到完成端口上(如果有多个IO都完成了,那么就在完成端口那里排成一个队列)。我们在另外一个线程里从完成端口不断地取出IO操作结果,然后根据需要再发出WSASend/WSARecv IO操作。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完成端口(Completion Port)是一种高效的 I/O 模型,它充分利用了操作系统 I/O 处理的异步特性,可以在一个线程池中处理大量的 I/O 操作,提高系统的并发处理能力。下面是一个使用完成端口模型的简单程序设计示例: 1. 初始化完成端口 ```csharp HANDLE completionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); ``` 2. 创建一组工作线程 ```csharp for (int i = 0; i < numThreads; i++) { HANDLE threadHandle = CreateThread(NULL, 0, WorkerThread, completionPort, 0, NULL); CloseHandle(threadHandle); } ``` 3. 向完成端口投递异步 I/O 请求 ```csharp // 打开文件 HANDLE fileHandle = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); // 创建 OVERLAPPED 结构体 OVERLAPPED *overlapped = new OVERLAPPED; ZeroMemory(overlapped, sizeof(OVERLAPPED)); // 向完成端口投递异步读取请求 ReadFileEx(fileHandle, buffer, bufferSize, overlapped, CompletionRoutine); ``` 4. 工作线程处理完成端口完成通知 ```csharp DWORD WorkerThread(LPVOID lpParam) { HANDLE completionPort = (HANDLE) lpParam; DWORD numBytes; ULONG_PTR completionKey; LPOVERLAPPED overlapped; while (GetQueuedCompletionStatus(completionPort, &numBytes, &completionKey, &overlapped, INFINITE)) { // 处理完成通知 CompletionRoutine(numBytes, completionKey, overlapped); } return 0; } ``` 5. 完成例程处理异步 I/O 请求的完成 ```csharp VOID CALLBACK CompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped) { // 处理异步 I/O 请求的完成 } ``` 以上是一个简单的完成端口模型程序设计示例,具体实现需要根据实际需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值