APC队列

#include <stdio.h>
#include <windows.h> // 保存 IO 操作的结果
CHAR Buffer1[] = { };
CHAR Buffer2[] = { }; // APC: 在线程处于闲暇状态才会调用
VOID WINAPI OverLappendRoutine(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped)
{
// 1. 每一个线程都有一个 APC 队列,其中保存的是一些
// 函数,这些函数会在线程处于[可警醒](闲暇)状态时
// 被依次队列,知道所有函数调用结束 // 2. 每当有一个 IO 请求被完成的时候,就会向 APC 队列
// 中添加一个函数并指定对应的参数,添加函数的顺序和
// IO 请求提交的顺序并不一定相同。 // 判断当前的 IO 请求是谁产生的
if (lpOverlapped->hEvent == (HANDLE)0x1)
printf("[%d]: %s", , Buffer1);
else
printf("[%d]: %s", , Buffer2);
} int main()
{
// 1. 以重叠 IO 的方式打开一个文件
HANDLE FileHandle = CreateFile(L"test.txt", GENERIC_ALL,
NULL, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); // 2. 投递第一个 IO 请求,读取 [3 ~ 6] 的字符,使用 Ex 版本的函数,需要提供回调函数
OVERLAPPED OverLapped1 = { };
OverLapped1.Offset = ;
OverLapped1.hEvent = (HANDLE)0x1; // 用于识别是哪一个 IO 请求
ReadFileEx(FileHandle, Buffer1, , &OverLapped1, OverLappendRoutine); // 3. 投递第二个 IO 请求,读取 [0 ~ 2] 的字符,初始化一个事件对象
OVERLAPPED OverLapped2 = { };
OverLapped2.hEvent = (HANDLE)0x2; // 用于识别是哪一个 IO 请求
ReadFileEx(FileHandle, Buffer2, , &OverLapped2, OverLappendRoutine); // 使用各种等待函数的 Ex 版本设置闲暇状态
SleepEx(, TRUE); return ;
}

网络编程基础_3.APC队列的更多相关文章

  1. 服务器编程入门(4)Linux网络编程基础API

      问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字( ...

  2. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...

  3. 【网络编程1】网络编程基础-TCP、UDP编程

    网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...

  4. 第5章 Linux网络编程基础

    第5章 Linux网络编程基础 5.1 socket地址与API 一.理解字节序 主机字节序一般为小端字节序.网络字节序一般为大端字节序.当格式化的数据在两台使用了不同字节序的主机之间直接传递时,接收 ...

  5. Linux网络编程基础API

    第5章 Linux网络编程基础API 探讨Linux网络编程基础API与内核中TCP/IP协议族之间的关系,并未后续章节提供编程基础.从3个方面讨论Linux网络API. socket地址API.so ...

  6. linux高性能服务器编程 (五) --Linux网络编程基础api

    第五章 Linux网络编程基础api 1.主机字节序和网络字节序 字节序是指整数在内存中保存的顺序.字节序分为大端字节序.小端字节序. 大端字节序:一个整数的高位字节数据存放在内存的低地址处.低位字节 ...

  7. 网络编程基础之TCP编程学习(一)

    网络编程基础了解 socket套接字 socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如TCP/UDP等网络通讯的手段. linux中的网络编程通过socke ...

  8. linux 网络编程 基础

    网络编程基础 套接字编程需要指定套接字地址作为参数,不同的协议族有不同的地址结构,比如以太网其结构为sockaddr_in. 通用套接字: struct sockaddr { sa_family_t ...

  9. C#网络编程基础知识

    C#网络编程基础知识一 1.IPAddress类 用于表示一个IP地址.IPAddress默认构造函数 public IPAddress(long address);一般不用 其中Parse()方法最 ...

随机推荐

  1. VirtualMachineManager

    Java Code Examples for com.sun.jdi.VirtualMachineManager https://www.programcreek.com/java-api-examp ...

  2. ArcGIS中生成蜂窝多边形算法解析

    近来有不少同学.都有问我关于蜂窝多边形的问题.也就是正六边形,也就是以下这个东东: 一般的问答模式例如以下: 亲们问:ArcGIS里面那个工具能够做这个东东? 虾神答:额,没有原生的工具. 亲们问:那 ...

  3. react-native 项目更名步骤

    刚开始开发项目的时候,更没有想好一个项目名称,如何才能更名一个RN APP名称呢,可按照如下方式操作即可. 使用说明 更改package.json { "name": " ...

  4. A Go library implementing an FST (finite state transducer)——mark下

    https://github.com/couchbaselabs/vellum Building an FST To build an FST, create a new builder using ...

  5. IOS各种调试

    IOS各种调试技巧豪华套餐   目录 前言逼优鸡知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global BreakPoint) 条件断点(Condational Breakpoints)打印 ...

  6. Flink源码阅读(1.7.2)

    目录 Client提交任务 flink的图结构 StreamGraph OptimizedPlan JobGraph ExecutionGraph flink部署与执行模型 Single Job Jo ...

  7. ubuntu/linuxmint更换163源及常用软件PPA源记录

    一.163源使用说明 (具体见:http://mirrors.163.com/,不推荐linuxmint更换源!!!) 以Wily(15.10)为例, 编辑/etc/apt/sources.list文 ...

  8. mysql通用分页存储过程遇到的问题(转载)

    mysql通用分页存储过程遇到的问题(转载) http://www.cnblogs.com/daoxuebao/archive/2015/02/09/4281980.html

  9. Bug分支(转载)

    转自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137602359178 ...

  10. 【WIP_S2】递归

    创建: 2018/01/14    递归  定义  自己召唤自己  通用形式  if (基本情况A的处理) {     ...     return 值A  } else if (基本情况B的处理) ...