zoukankan      html  css  js  c++  java
  • 利用内核对象同步线程

    内核对象可用于不同进程间线程的同步。

    1.Wait系列函数

    WaitForSingleObject

           挂起当前线程,直到该函数返回。(被等待的对象处于Signal状态或等待超时)

           若有多个线程调用该函数等待同一个内核对象,那么当这个内核对象处于Signal状态时只有一个线程会被唤醒。

           若线程中有创建Windows的代码,需要用MsgWaitForMultipleObjects代替WaitForSingleObject,否则会产生死锁。

     

    WaitForMultipleObjects

    若需要同时等待多个内核对象,则可以调用该函数

     

    2.事件内核对象

     

    自动事件

    当事件处于Signal状态时,只有一个等待该事件的线程会被唤醒。            之后事件会被自动回到Non Signal状态。

    手动事件

    当事件处于Signal状态时,所有等待该事件的线程都会被唤醒。                之后需要调用ResetEventEvent对象调回到Non Signal状态。

    3.信号量对象

    信号量可以控制可以时运行的线程的数量。

    在创建信号量对象时要用一个初值来初始化lMaximumCount(允许运行线程数目的最大值),并把lInitialCount的值赋给CurrentSource

    信号量内部用CurrentSource来记录当前可运行线程的数量,

                        CurrentSource大于0时,信号量处于Signal状态。当CurrentSource=0

                        CurrentSource=0时,信号量处于Non Signal状态。

     

    WaitForSingleObject会使CurrentSource减1, ReleaseSemaphore会使CurrentSource+1.

     

    4.互斥锁

    WAIT_ABANDONED

    Windows中使用互斥锁可以有效的避免死锁。

    当持有Mutex的线程在调用ReleaseMutex前意外退出,如ExitThreadTerminateThread。系统会把Mutex分给等待Mutex的线程中的一个并返回Wait_Abandoned,从而避免了死锁。

     

    5.       其它同步方法

    Asynchronous Device I/O

    WaitForInputIdle

    MsgWaitForMultipleObjects(Ex)

    WaitForDebugEvent

    SignalObjectAndWait

    Detecting Deadlocks with the Wait Chain Traversal API

     

    6.Common API:

      WaitForSingleObject  WaitForMultipleObjects

      MsgWaitForMultipleObjects

      CreateEvent CreateEventEx SetEvent ResetEvent OpenEvent

      CreateSemaphore OpenSemaphore

      CreateMutex OpenMutex ReleaseMutex 

  • 相关阅读:
    Java Number类
    Java StringBuffer和StringBuilder类
    Java String类
    Java 日期时间
    Java 数组
    Java 方法
    Java正则表达式
    一步步学习SPD2010--第五章节--处理数据视图(6)--使用XSLT
    一步步学习SPD2010--第五章节--处理数据视图(5)--显示和隐藏内容
    一步步学习SPD2010--第五章节--处理数据视图(4)--应用条件格式
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/1994908.html
Copyright © 2011-2022 走看看