zoukankan      html  css  js  c++  java
  • 多线程笔记2

    第三章:快跑与等待

    1.绝对不要在win32中使用busy loop。

    2.等待一个线程的结束:

    DWORD WaitForSingleObject(
    HANDLE hHandle,                   //等待对象的handle
    DWORD dwMilliseconds            //等待时间,时间终了,即使handle尚未激发,此函数还是要返回。0立刻返回,INFINITE无穷等待

    );

      函数失败:返回WAIT_FAILED

      函数成功:

      (1)等待的目标核心对象变成激发状态,返回值为WAIT_OBJECT_0

      (2)核心对象激发之前,等待时间终了,返回值为WAIT_TIMEOUT

      (3)如果一个拥有mutex的线程结束前没有释放mutex,则传回WAIT_ABANDONED

    3.核心对象激发的意义

    (1)Thread :线程运行时处于未激发状态,线程结束对象被激发。对象由CreateThread或CreateRemoteThread产生。

    (2)Process:进程运行时处于未激发状态,进程结束对象被激发。对象由CreateProcess或OpenProcess产生。

    (3)Change Notification:当一个特定的磁盘子目录发生变化时,此对象即被激发。此对象由FindFirstChangeNotification产生。

    (4)Console Input:当console窗口输入缓冲区中有数据可用时,此对象处于激发状态。CreateFile、GetStdFile产生console handle。

    (5)Event:对象的状态受控于3个win32函数:SetEvent,PulseEvent,ResetEvent。CreateEvent、OpenEvent可以传回一个Eventobject handle。Event对象的状态也可以被操作系统设定---如果使用与overlapped操作时。

    (6)Mutex:如果Mutex没有被任何线程拥有,就是处于激发状态。一旦一个等待mutex的函数返回了,mutex自动重置为未激发状态。CreateMutex、OpenMutex可以获得一个mutex handle。

    (7)Semaphore:有个计数器,约束拥有者个数。计数器大于0,semaphore处于激发状态;等于0,处于未激发状态。CreateSemaphore,OpenSemaphore可以传回一个semaphore handle。

      补充说明(3):这些变化指的是:      

    FILE_NOTIFY_CHANGE_FILE_NAME       产生、删除、重新命名一个文件
    FILE_NOTIFY_CHANGE_DIR_NAME        产生或删除一个子目录
    FILE_NOTIFY_CHANGE_ATTRIBUTES     目录及子目录中的任何属性改变
    FILE_NOTIFY_CHANGE_SIZE                 目录及子目录中的任何文件大小的改变
    FILE_NOTIFY_CHANGE_LAST_WRITE     目录及子目录中的任何文件的最后写入时间的改变
    FILE_NOTIFY_CHANGE_SECURITY         目录及子目录中的任何安全属性改变

    4.等待多个对象

    DWORD WaitForMultipleObjects(
    DWORD nCount,                                     //表示lpHandles所指之handles数组的元素个数。最大容量是MAXIMUM_WAIT_OBJECTS
    CONST HANDLE *lpHandles,                    //指向一个由对象handles所组成的数据,这些handles不需要为相同的类型。
    BOOL bWaitAll,               //True表示所有的handles都必须激发,函数才返回。否则此函数将在任何一个handle激发返回。
    DWORD dwMilliseconds           //等待时间
    );

    返回值:

    (1)如果因时间终了返回,返回值为WAIT_TIMEOUT

    (2)如果bWaitAll为True,返回值为WAIT_OBJECT_0

    (3)如果bWaitAll为False,则将返回值减去WAIT_OBJECT_0,就表示数组中的哪个handle被激发了

    (4)如果等待的对象中有任何的Mutex,返回值可能从WAIT_ABANDONED_0 到 WAIT_ABANDONED_0 + nCount - 1.

    (5)如果函数失败,传回WAIT_FAILED.

    5.MsgWaitForMultipleObjects:  “对象被激发” 或 “消息到达队列” 时被唤醒而返回

    DWORD MsgWaitForMultipleObjects(
    DWORD nCount,
    LPHANDLE pHandles,
    BOOL fWaitAll,
    DWORD dwMilliseconds,
    DWORD dwWakeMask               //欲观察的用户输入消息
    );

    输入消息:

    QS_ALLINPUT
    QS_HOTKEY
    QS_INPUT
    QS_KEY
    QS_MOUSE
    QS_MOUSEBUTTON
    QS_MOUSEMOVE

    QS_PAINT
    QS_POSTMESSAGE
    QS_SENDMESSAGE
    QS_TIMER

  • 相关阅读:
    python-pycharm中使用anaconda部署python环境
    Spring Boot 整合 Redis 实现缓存操作
    Spring中的ThreadPoolTaskExecutor
    Redis-基本数据类型与内部存储结构
    Redis如何存储对象与集合示例详解
    redis存储对象
    java在注解中绑定方法参数的解决方案
    spring boot整合JMS(ActiveMQ实现)
    springboot集成activemq
    NodeJS、NPM安装配置步骤(windows版本)
  • 原文地址:https://www.cnblogs.com/programmer-wfq/p/4636247.html
Copyright © 2011-2022 走看看