• 浅尝《Windows核心编程》之 内核对象


    1.       内核对象

    内核对象主要要用来供系统和应用程序管理系统资源,像进程、线程、文件等。存取符号对象、事件对象、文件对象、作业对象、互斥对象、管道对象、等待计时器对象等都是内核对象。内核对象由内核拥有,并不是进程所拥有。

    具体可以参见这位大哥的文章

    http://www.cnblogs.com/xuyuan77/archive/2008/04/23/1167623.html

     

    2.       通知

    当内核对象得到通知时,其状态变为“已通知”,否则就是“未通知”。当线程等待的对象处于“为通知”状态下,线程不可调度,否则为可调度。

     

    3.       各个内核对象的内核对象和线程同步之间的关系

     

     

    4.       几种常用的内核对象介绍

    (1)       进程(略)

    (2)       线程(略)

    (3)       事件(EVENT

          1. 创建

    HANDLE WINAPI CreateEvent(
      __in_opt  LPSECURITY_ATTRIBUTES lpEventAttributes,
      __in      BOOL bManualReset,
      __in      BOOL bInitialState,
      __in_opt  LPCTSTR lpName);
     

      通常第一参数和第四参数设为NULL。
      第二参数表示是否要人工重置。人工重置和自动重置的区别如下:当人工重置的时间得
    到通知时,等待该时间的所有线程均变成可调度线程,当一个自动重置的时间得到通知时,
    等待该时间的线程中只有一个线程变为可调度线程(因为os对线程的调度而随机选择)。其
    中的实质就是Microsoft为自动重置的时间定义了应该成功等待的副作用规则,即当线程成功
    地等待到该对象时(意思是一个等待的线程因为得到通知状态而被激活),自动重置的事件
    就会自动重置到未通知状态(其他等待这个事件的线程又被挂起了)。
      第三参数为初始状态,false表示未通知状态,true表示通知状态。

     2. 修改状态

    动态改为通知状态的函数为SetEvent(),动态改为未通知状态的函数是ResetEvent().

     

     3. 关闭事件

    CloseHandle()

     

     (4)     等待定时器

    几个例子,见《Windows核心编程》第六章P204

        等待计时器和定时器的区别

     

        最后要说明的是,凡是称职的 Wi n d o w s编程员都会立即将等待定时器与用户定时器(用S e t Ti m e r函数进行设置)进行比较。它们之间的最大差别是,用户定时器需要在应用程序中设置许多附加的用户界面结构,这使定时器变得资源更加密集。另外,等待定时器属于内核对象,这意味着它们可以供多个线程共享,并且是安全的。

        用户定时器能够生成W M _ T I M E R消息,这些消息将返回给调用 S e t Ti m e r(用于回调定时器)的线程和创建窗口(用于基于窗口的定时器)的线程。因此,当用户定时器报时的时候,只有一个线程得到通知。另一方面,多个线程可以在等待定时器上进行等待,如果定时器是个人工重置的定时器,则可以调度若干个线程。

        如果要执行与用户界面相关的事件,以便对定时器作出响应,那么使用用户定时器来组织代码结构可能更加容易些,因为使用等待定时器时,线程必须既要等待各种消息,又要等待内核对象(如果要改变代码的结构,可以使用 M s g Wa i t F o r M u l t i p l e O b j e c t s函数)。最后,运用等待定时器,当到了规定时间的时候,更有可能得到通知。

               W M _ T I M E R消息始终属于最低优先级的消息,当线程的队列中没有其他消息时,才检索该消息。等待定时器的处理方法与其他内核对象没有什么差别,如果定时器发出报时信息,而你的线程正在等待之中,那么你的线程就会醒来。

     

     

  • 相关阅读:
    Struts2-Spring和Hibernate整合
    windows下使用Eclipse编译执行MapReduce程序 Hadoop2.6.0/Ubuntu
    Android 基于Netty的消息推送方案之对象的传递(四)
    基于JQuery实现表单元素值的回写
    iOS 从UITableViewController中分离数据源
    navicat premium 的使用——navicat 连接MySQL数据库
    【甘道夫】Ubuntu14 server + Hadoop2.2.0环境下Sqoop1.99.3部署记录
    罗永浩和锤子手机:对不起,我被你打动了
    用C语言解决迷宫问题
    Android利用reative_layout生成梅花界面
  • 原文地址:https://www.cnblogs.com/aicro/p/1501224.html
Copyright © 2020-2023  润新知