• 第九章 线程与内核对象的同步(1)


    进程内核对象,是一个BOOBLE值,进程运行的时候内核对象处于未通知状态(FALSE),当进程终止的时候处于已通知状态(TRUE)。当线程等待的内核对象处于未通知状态时,线程不可调度。当内核对象变为已通知状态时线程立即变为可调度状态并投入运行。

    可处于已通知态和为通知态的内和对象:

    进程、线程、作业、文件、控制台输入、文件修改通知、事件、可等待计时器、信标、互斥对象

    一、等待函数

    等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。

    1. DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds);

    hObject标识一个能够支持被通知/未通知的内核对象。dwMilliseconds将等待对象变为已通知状态需要等待的时间,可以传递为INFINITE(该调用线程将永久等待下去,直到进程终止)INFINITE已经定义为0XFFFFFFFF(-1)。不能为dwMilliseconds传递为0,否则函数立即返回。

    该函数的返回值能够指明调用线程变为可调度状态的原因,WAIT_OBJECT_0线程等待的对象变为已通知状态,WAIT_TIMEOUT设置的等待时间已到。WAIT_FAILED给函数传递的值错误(可以调用GetLastError检测错误信息)。

    1. DWORD WaitForMultipleObjects(DWORD dwCount, CONST HANDLE* phObjects,

    BOOL fWaitAll, DWORD dwMilliseconds);

    dwCount要查看内核对象的数量(在1MAXIMUMWAIT_OBJECTS[Windows头文件定义为64]之间的数)。phObjects指向内核对象句柄的数组的指针。fWaitAll若传递为TRUE(让线程进入等待状态,直到所有指定的内核对象都变为已通知状态前,不允许调用线程运行),若为FALSE(让线程进入等待状态,直到指定内核对象中的任何一个变为已通知状态)。dwMilliseconds将等待对象变为已通知状态需要等待的时间(如果规定的时间到了,那么该函数无论如何都会返回。如果传递为INFINITE则应考虑避免死锁发生)。

    该函数的返回值指明调用线程变为可调度状态的原因,fWaitAll若传递为TRUE WAIT_OBJECT_0即所有对象均变为已通知状态。若为FALSE WAIT_OBJECT_xx0+ dwCount-1的一个值)即哪个对象变为已通知状态。WAIT_TIMEOUT设置的等待时间已到。WAIT_FAILED给函数传递的值错误。

    1. 成功等待的副作用

    成功等待,指函数发现等待的特定对象变为已通知对象,且返回相对于WAIT_OBJECT_0的值。(返回WAIT_TIMEOUTWAIT_FAILED则函数调用没有成功,对象的状态就不能改变)。

    成功等待的副作用,当一个(被等待的)对象的状态改变时称为成功等待的副作用。

    进程和线程内核对象就根本没有任何副作用,也就是说,在这些对象之一上进行等待决不会改变对

    象的状态。

    WaitForMultipleObjects是以原子操作方式运行的。当它检查内核对象的状态时,其他任何线程都无法背着对象改变它的状态。

    如果多个线程等待单个内核对象,那么当该对象变成已通知状态时,系统“先进先出”的方案(等待了最长时间的线程将得到该对象)决定唤醒哪个线程

  • 相关阅读:
    Leetcode929.Unique Email Addresses独特的电子邮件地址
    Leetcode914.X of a Kind in a Deck of Cards卡牌分组
    new Date()设置日期在IOS的兼容问题
    koa2 使用passport权限认证中间件
    当 better-scroll 遇见 Vue
    百度地图开发
    通过Ajax方式上传文件,使用FormData进行Ajax请求
    app中页面滑动,防止a链接误触
    js判断是微信、QQ内置浏览器打开页面
    百度天气预报接口介绍
  • 原文地址:https://www.cnblogs.com/dyufei/p/2573986.html
Copyright © 2020-2023  润新知