• I/O完成端口、异步I/O、APC和线程池(三)——APC


    Alertable IO(告警IO)提供了更有效的异步通知形式。ReadFileEx / WriteFileEx在发出IO请求的同时,提供一个回调函数(APC过程),当IO请求完成后,一旦线程进入可告警状态,回调函数将会执行。
        以下五个函数能够使线程进入告警状态:
        SleepEx
        WaitForSingleObjectEx
        WaitForMultipleObjectsEx
        SignalObjectAndWait
        MsgWaitForMultipleObjectsEx
        线程进入告警状态时,内核将会检查线程的APC队列,如果队列中有APC,将会按FIFO方式依次执行。如果队列为空,线程将会挂起等待事件对象。以后的某个时刻,一旦APC进入队列,线程将会被唤醒执行APC,同时等待函数返回WAIT_IO_COMPLETION。
        QueueUserAPC可以用来人为投递APC,只要目标线程处于告警状态时,APC就能够得到执行。
        使用告警IO的主要缺点是发出IO请求的线程也必须是处理结果的线程,如果一个线程退出时还有未完成的IO请求,那么应用程序将永远丢失IO完成通知。然而以后我们将会看到IO完成端口没有这个限制。
        下面的代码演示了QueueUserAPC的用法。


    DWORD WINAPI WorkThread(PVOID pParam)
    {
        HANDLE Event = (HANDLE)pParam;

        for(;;)
        {
            DWORD dwRet = WaitForSingleObjectEx(Event, INFINITE, TRUE);
            if(dwRet == WAIT_OBJECT_0)
                break;
            else if(dwRet == WAIT_IO_COMPLETION)
                printf("WAIT_IO_COMPLETION\n");
        }

        return 0;
    }

    VOID CALLBACK APCProc(DWORD dwParam)
    {
        printf("%s", (PVOID)dwParam);
    }

    void TestAPC(BOOL bFast)
    {
        HANDLE QuitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

        HANDLE hThread = CreateThread(NULL,
            0,
            WorkThread,
            (PVOID)QuitEvent,
            0,
            NULL);

        Sleep(100); // Wait for WorkThread initialized.

        for(int i=5; i>0; i--)
        {
            QueueUserAPC(APCProc, hThread, (DWORD)(PVOID)"APC here\n");

            if(!bFast)
                Sleep(1000);
        }

        SetEvent(QuitEvent);
        WaitForSingleObject(hThread, INFINITE);
        CloseHandle(hThread);
    }


    参考书目

    1,    MSDN Library
    2,    《Windows高级编程指南》
    3,    《Windows核心编程》
    4,    《Windows 2000 设备驱动程序设计指南》

  • 相关阅读:
    canvas-绘制矩形-读书笔记
    获取页面路径中的参数
    微信小程序引用组件的方式
    this指向知识梳理
    for循环整理
    微信小程序使用wxs(小程序的一套脚本语言)
    textarea层级过高的解决办法
    防止用户连续点击按钮导致页面数据重复
    微信小程序tab切换
    HTML/CSS 知识点01 (转)
  • 原文地址:https://www.cnblogs.com/snailrun/p/2644858.html
Copyright © 2020-2023  润新知