zoukankan      html  css  js  c++  java
  • 几种内核对象的受信与非受信状态

    已通知状态(受信状态) 未通知状态(非受信状态)

    进程内核对象

          当进程正在运行时,进程内核对象处于未通知状态。当进程停止运行时,就处于已通知状态。可以通过等待进程来检查进程是否仍然运行。

          无成功等待的副作用。

    线程内核对象

          当线程正在运行时,线程内核对象处于未通知状态。当线程停止运行时,就处于已通知状态。可以通过等待线程来检查线程是否仍然运行。

          无成功等待的副作用。

    事件内核对象

          包括人工重置的事件和自动重置的事件。

    当人工重置事件得到通知时,等待该事件的所有线程成为可调度线程;它没有成功等待副作用。

    当自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。其成功等待的副作用是该对象自动重置为未通知状态。

          事件内核对象通过CreateEvent创建,初始可以是通知或未通知状态。SetEvent将事件改为已通知状态,ResetEvent将事件设为未通知状态。

          当一个线程执行初始化操作,然后通知另一个线程执行剩余的操作时,经常使用人工事件对象。另外如果一个写线程,多个读线程,可以让写线程完成写操作时通过人工事件通知读线程读取数据。

    而自动事件对象则可以用于保护资源在同一时间只有一个线程可以访问,因为它保证只有一个线程被激活。

    等待定时器内核对象

          等待定时器是在某个时间或按规定的时间间隔发出自己的信号通知的内核对象。包括人工重置的定时器和自动重置的定时器。初始必须是未通知状态。

          当发出人工重置的定时器信号时,等待该定时器的所有线程变为可调度;无成功等待副作用。

          当发出自动重置的定时器信号时,只有一个等待线程变为可调度线程。成功等待副作用是重置对象。

          通过CreatWaitableTimer创建,CancelWaitableTimer撤销一个定时器,SetWaitableTimer告诉定时器何时让其变为已通知状态。

    信号量内核对象

          信号量用来对资源进行计数。它包含两个32位值,一个表示能够使用的最大资源数量,一个表示当前可用的资源数量。

          信号量的使用规则如下:

    1.       如果当前资源数量大于0,发出信号量信号

    2.       如果当前资源数量是0,不发出信号量信号

    3.       不允许当前资源数量为负值

    4.       当前资源数量不能大于最大信号数量

    通过CreateSemaphore创建。ReleaseSemaphore来释放资源,从而使当前资源数量增加。

    当调用等待函数时,它会检查信号量的当前资源数量。如果它的值大于0,那么计数器减1,调用线程处于可调度状态。如果当前资源是0,则调用函数的线程进入等待状态。当另一个线程对信号量的当前资源通过ReleaseSemaphore进行递增时,系统会记住该等待线程,并将其变为可调度状态。

    当有多个资源共访问时,经常使用信号量内核对象。

    其成功等待副作用是当前资源数量减1。

    互斥器内核对象

          互斥器保证线程拥有对单个资源的互斥访问权。互斥对象类似于关键代码区,但它是一个内核对象。

          互斥器不同于其他内核对象,它有一个“线程所有权”的概念。它如果被某个线程等待成功,就属于该线程。

          互斥器的使用规则如下:

    1.       如果线程ID是0(无效ID),互斥对象不被任何线程拥有,并且发出该互斥对象的通知信号。

    2.       如果ID是非0数字,那么一个线程可以拥有互斥对象,并且不发出该互斥对象的通知信号。

    3.       互斥器有一个递归计数器。如果线程已经拥有了互斥器,而它再次等待该互斥器,则马上成功返回;而且递归计数器加1。

    通过CreateMutex创建。ReleaseMutex用来释放互斥器。如果线程拥有互斥器,则首先把递归计数器减1,如果减到0,则线程释放互斥器,或者说互斥器的所属线程为空。此后其他线程就可以等待得到该互斥器了。但是如果一个线程ReleaseMutex了一个本来不归他所有的互斥器,则不会有任何效果。

          互斥器常用于保护由多个线程访问的内核块。互斥器保证了访问内存块的任何线程拥有对该内存块的独占访问。

          其成功等待副作用是将所有权赋予线程,并将递归计数器加1。

          互斥器和关键代码区的功能是非常相似的,只是一个是用户对象,一个是内核对象。

  • 相关阅读:
    基本数据类型
    运算
    登录程序
    MySQL索引
    内存泄漏排查&CPU负载高排查
    dubbo
    SPI
    缓存,热点key
    Java BigDecimal
    Spring Bean's life
  • 原文地址:https://www.cnblogs.com/cxp2009/p/3444912.html
Copyright © 2011-2022 走看看