IOCP完成端口模拟线程池

  • 一,样例介绍

一,样例介绍

生产者-消费者模式是一种非常常见的设计模式,它可以很好地模拟实际编程中的大部分使用场景,而IO完成端口也是用来实现多线程之间的通信,因此,本实例基于该模式完成。
     首先,我们需要创建IO完成端口,最后一个参数为0,默认创建的IO完成端口数目就是处理器数目,同时,和要创建一定数目的消费者线程,来处理数据。

//创建1个IO完成端口(最后一个参数为0表示创建处理器个个数的IO完成端口)g_hIoCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 0);//创建的消费者线程(与IO端口绑定的线程)SYSTEM_INFO si; GetSystemInfo(&si); int nCount = si.dwNumberOfProcessors * 2;for (int i = 0; i < nCount; i++){HANDLE hThread = CreateThread(nullptr, 0, ConsumeThread, 0, 0, 0);CloseHandle(hThread);}

然后创建一个生产者线程,用来生产数据,同时当IO请求完成后,将已完成的IO通知追加到IO完成端口的队列中。

//生产者线程,产生数据HANDLE hThread2 = CreateThread(nullptr, 0, ProductThread, 0, 0, 0);CloseHandle(hThread2);

ConsumeThread实现如下:

//消费者线程
DWORD _stdcall ConsumeThread(LPVOID param)
{DWORD dwData;DWORD  dwCmpKey = 0;OVERLAPPED *pOverlapped = NULL;SOverLapped *pOverlappedBuf = nullptr;pInfomation pInfo = nullptr;while (true){if (GetQueuedCompletionStatus(g_hIoCompletionPort, &dwData, &dwCmpKey, &pOverlapped, INFINITE)){if (dwCmpKey && pOverlapped){pOverlappedBuf = CONTAINING_RECORD(pOverlapped, SOverLapped, m_ol);pInfo = pOverlappedBuf->pInfo; //取到我们自定义的数据结构字段std::cout << pInfo->szBuf;delete pInfo;delete pOverlappedBuf;}}}return 0;
}

在这里,我们声明了一个SOverLapped结构体,它里面包含了OVERLAPPED字段,以及一个自定义的消息结构体:

struct SOverLapped
{OVERLAPPED m_ol;pInfomation pInfo;
};

CONTAINING_RECORD宏的作用就是根据结构体类型和结构体中成员变量地址和名称则可求出该变量所在结构体的指针。由此得到我们自定义消息指针。
     ProductThread实现如下:

//生产者线程
DWORD _stdcall ProductThread(LPVOID param)
{for (int i = 0; i < 100; i++){SOverLapped *pBuf = new SOverLapped;pInfomation pInfo = new Infomation;pInfo->nLength = i;sprintf_s(pInfo->szBuf, "hello IoCompletionPort--%d \n", i);pBuf->pInfo = pInfo;DWORD dwCmKey = 0;PostQueuedCompletionStatus(g_hIoCompletionPort, 0, (ULONG)&dwCmKey, &(pBuf->m_ol));}return 0;
}

PostQueuedCompletionStatus函数为我们提供了一种方式来与线程池中的所有线程进行通信。当我们终止服务应用程序时,如果各线程和在等待完成端口但是又没有已经完成的IO请求,那么它们将无法被唤醒。此时我们可以通过为线程池中的每个线程都调用一次PostQueuedCompletionStatus,将它们全部唤醒,然后各线程会对GetQueuedCompletionStatus的返回值进行检查,如果发现应用程序正在终止,那么它就可以进行清理工作并正常退出。

IOCP完成端口模拟线程池相关推荐

  1. 多线程的使用——模拟线程池的实现(2015-12-02 00:14:59)

    为什么80%的码农都做不了架构师?>>>    线程池接口: package com.dreyer.pattern.threadPool;/*** @description 线程池接 ...

  2. java自定义模拟线程池

    java 线程池API提供了newCachedThreadPool() newFixedThreadPool(int) 等方法 1 public static ExecutorService newC ...

  3. python tcp server分包_如何创建线程池来监听tcpserver包python

    我试图创建线程池来同时对传入的tcp包执行一些操作.在 我在python3中找不到任何内置线程池.我也读了一些关于multiprocessing.Pool的文章,但是它不支持内存共享.所以我使用Que ...

  4. Windows核心编程 第十一章 线程池的使用

    第11章 线程池的使用 第8章讲述了如何使用让线程保持用户方式的机制来实现线程同步的方法.用户方式的同步机制的出色之处在于它的同步速度很快.如果关心线程的运行速度,那么应该了解一下用户方式的同步机制是 ...

  5. 《Windows via C/C++》学习笔记 —— Windows 线程池

    线程池(thread pool),允许有多个线程同时存在,并发执行,并且这些线程受到统一管理. 在Windows Vista中,提供了全新的线程池机制,一般这些线程池中的线程的创建的销毁是由操作系统自 ...

  6. 「视频版」当线程池溢出之后,程序会奔溃吗?面试突击 007 期

    哈喽,大家好,我是老王,欢迎来到第 7 期的 Java 面试突击. 本文的面试题是,当线程池的任务溢出之后,程序会奔溃吗? 这个问题问的是关于线程池的任务数超过线程池的承载能力之后,会出现什么情况? ...

  7. java callable 线程池_JAVA 线程池之Callable返回结果

    本文介绍如何向线程池提交任务,并获得任务的执行结果.然后模拟 线程池中的线程在执行任务的过程中抛出异常时,该如何处理. 一,执行具体任务的线程类 要想 获得 线程的执行结果,需实现Callable接口 ...

  8. 线程池中线程抛了异常如何处理?

    文章目录 1. 模拟线程池抛异常 2. 如何获取和处理异常 方案一:使用 try -catch 方案二:使用Thread.setDefaultUncaughtExceptionHandler方法捕获异 ...

  9. java线程池_Java 并发编程 线程池源码实战

    作者 | 马启航 杏仁后端工程师.「我头发还多,你们呢?」 一.概述 笔者在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写 ...

  10. Java 并发编程 -- 线程池源码实战

    一.概述 小编在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写的太简单,只写了一点皮毛,要么就是是晦涩难懂,看完之后几乎都 ...

最新文章

  1. Android SDK 路径修改
  2. 如何解决海康网盘下载大文件中断问题?(idm更新链接)(貌似更新链接还是有问题)(用谷歌浏览器下载)
  3. hdu 5203(枚举)
  4. 鸿蒙系统开发大会怎么参加,鸿蒙2.0来了?华为将举行开发者大会,做自己的手机系统!...
  5. 使用wireshark抓包并进行网络协议分析
  6. python图像识别教程pdf_如何使用Python进行PDF图片识别OCR
  7. hashcat简单使用
  8. linux硬盘坏了无法查看分区,Linux 磁盘坏道检测和修复 查看硬盘坏道代码
  9. 如何把两个表格合并到一起
  10. VirtualBox网络配置:NAT+Host-Only实现连接外网+主机互通
  11. java 图片格式校验_(转载)Java对上传的图片进行格式校验以及安全性校验
  12. NLP从入门到实战(三)
  13. 和图片有关的几个旋转属性
  14. HTML——flex布局
  15. 浙江工商大学20复试上机题之月利率
  16. 一个标准的行业分析怎么做
  17. 三国武将10大巅峰时刻
  18. Python之OpenGL笔记(34):采用了顶点常量属性方法画多彩六角星
  19. lammps数据后处理:python绘制应力应变曲线 附程序代码
  20. 阿里云本地上传文件夹内所有内容代码

热门文章

  1. 离散数学及其应用知识点总结
  2. 信息论复习四:信源编码
  3. 计算机vb期末试题及答案,VB期末考试试题及答案
  4. 中国物联网卡的发展历史和变革
  5. dss中文含义_DSS(中文译名:决策支持系统),这是什么系统?有多少个种类?...
  6. win7更改计算机名后桌面壁纸,win7桌面壁纸不能更换怎么办-处理win7桌面壁纸无法更换的方案 - 河东软件园...
  7. FY-4A建立中国区域图像行列号转经纬度的经纬度查找表进行几何校正
  8. 官方示例之地球模块五:ThingLayer
  9. 基于stm32智能门锁系统
  10. 学习计算机组装与维护的意义,学习计算机组装维护的目的与心得体会!