Windows Via C/C++:内核模式下的线程同步——概述

上一章中,我们讨论了在用户模式下同步线程的各种方法。用户模式下同步机制的效率较高,但也存在局限。比如临界区(Critical Sections)只能用来同步同一进程内的线程,而且由于无法指定等待超时时间,使用临界区时也极有可能发生死锁。本章将阐述如何在内核模式下同步线程,你将会看到,使用内核对象同步线程比用户模式下的同步方法更为通用。事实上,使用内核对象的唯一不足之处是性能问题——当使用内核对象同步线程时,当前线程必须从用户模式转入内核模式,在x86平台上仅仅是转换过程就会消耗大约200个CPU周期,当然这并不包括执行内核代码所需的时间。

本书中谈到的大多数内核对象都可以用来同步,包括进程、线程、作业等。对线程同步而言,这些内核对象都拥有signaled和unsignaled两个状态。内核对象在何时处于何处状态是由微软决定的,比如,所有的进程内核对象在创建时都是unsignaled状态,进程结束时操作系统会将相应内核对象的状态置为signaled并一直保持该状态。当你的代码需要检查某进程是否还在运行时,你可以检查该进程对应的内核对象的状态,Windows提供了许多函数来实现这一需求。线程内核对象遵循同样的规则,既线程总是以nonsignaled状态被创建的,线程结束时其状态会被置为signaled。

以下是拥有signaled/unsignaled状态的内核对象:

  • 进程(Processes)
  • 线程(Threads)
  • 作业(Jobs)
  • 文件和控制台标准输入/输出/错误流(File and console standard input/output/error streams)
  • 事件(Events)
  • 可待待定时器(Waitable timers)
  • 信号量(Semaphores)
  • 互斥量(Mutexes)

线程可以将自己置于等待状态,直到某个对象变成signaled状态。本章中将介绍一些允许线程等待内核对象变为signaled状态的API函数,接下来,我们会讨论Windows提供的用来同步线程的内核对象:事件、可待待定时器、信号量以及互斥量。

你可能感兴趣的:(windows,作业,events,jobs,api,file)