关于windows的进程处理(八)

Critical Section、Mutex、Semaphore、Event几种线程控制方法对比说明:数据库

查询了一下以为http://blog.csdn.net/wind19/article/details/7520860文章已经写的很是细致了,因而摘录了一些主要内容以下,若是想看原文,能够直接查看原文便可。安全

临界区(Critical Section)
    保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只容许一个线程对共享资源进行访问。若是有多个线程试图同时访问临界区,那么在有一个线程进 入后其余全部试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其余线程能够继续抢占,并以此达到用原子方式操做共 享资源的目的。
互斥量(Mutex)
   互斥(Mutex)是一种用途很是普遍的内核对象。可以保证多个线程对同一共享资源的互斥访问。同临界区有些相似,只有拥有互斥对象的线程才具备访问资源 的权限,因为互斥对象只有一个,所以就决定了任何状况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交 出,以便其余线程在得到后得以访问资源。与其余几种内核对象不一样,互斥对象在操做系统中拥有特殊代码,并由操做系统来管理,操做系统甚至还容许其进行一些 其余内核对象所不能进行的很是规操做。 互斥量跟临界区很类似,只有拥有互斥对象的线程才具备访问资源的权限,因为互斥对象只有一个,所以就决定了任何状况下此共享资源都不会同时被多个线程所访 问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其余线程在得到后得以访问资源。互斥量比临界区复杂。由于使用互斥不只仅可以在同一应 用程序不一样线程中实现资源的安全共享,并且能够在不一样应用程序的线程之间实现对资源的安全共享。
信号量(Semaphores)
    信号量对象对线程的同步方式与前面几种方法不一样,信号容许多个线程同时使用共享资源,这与操做系统中的PV操做相同。它指出了同时访问共享资源的线程最大 数目。它容许多个线程在同一时刻访问同一资源,可是须要限制在同一时刻访问此资源的最大线程数目。在用CreateSemaphore()建立信号量时即 要同时指出容许的最大资源计数和当前可用资源计数。通常是将当前可用资源计数设置为最大资源计数,每增长一个线程对共享资源的访问,当前可用资源计数就会 减1,只要当前可用资源计数是大于0的,就能够发出信号量信号。可是当前可用计数减少到0时则说明当前占用资源的线程数已经达到了所容许的最大数目,不能 在容许其余线程的进入,此时的信号量信号将没法发出。线程在处理完共享资源后,应在离开的同时经过ReleaseSemaphore()函数将当前可用资 源计数加1。在任什么时候候当前可用资源计数决不可能大于最大资源计数。 信号量是经过计数来对线程访问资源进行控制的,而实际上信号量确实也被称做Dijkstra计数器。
事件(Event)
    事件对象也能够经过通知操做的方式来保持线程的同步。而且能够实现不一样进程中的线程同步操做。
    使用临界区只能同步同一进程中的线程,而使用事件内核对象则能够对进程外的线程进行同步,其前提是获得对此事件对象的访问权。
总结:并发

    1. 互斥量与临界区的做用很是类似,但互斥量是能够命名的,也就是说它能够跨越进程使用。因此建立互斥量须要的资源更多,因此若是只为了在进程内部是用的话使 用临界区会带来速度上的优点并可以减小资源占用量。由于互斥量是跨进程的互斥量一旦被建立,就能够经过名字打开它。函数

    2. 互斥量(Mutex),信号灯(Semaphore),事件(Event)均可以被跨越进程使用来进行同步数据操做,而其余的对象与数据同步操做无关,但 对于进程和线程来说,若是进程和线程在运行状态则为无信号状态,在退出后为有信号状态。因此可使用WaitForSingleObject来等待进程和 线程退出。操作系统

    3. 经过互斥量能够指定资源被独占的方式使用,但若是有下面一种状况经过互斥量就没法处理,好比如今一位用户购买了一份三个并发访问许可的数据库系统,能够根 据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操做,这时候若是利用互斥量就没有办法完成这个要求,信号灯对象能够说是一种资源计数 器。.net

相关文章
相关标签/搜索