delphi线程监视器System.TMonitor

delphi线程监视器System.TMonitor

线程的监视器System.TMonitor:
    关于System.TMonitor及Pulse和Wait:  
    1、Wait将完全原子释放锁(不管递归计数如何),并阻塞调用线程直到另一个线程调用Pulse或PulseAll点亮全局脉冲信号灯。第一次重载等待函数Wait将假定assume存在锁定的对象locked object并且将要wait的对象是相同的,因此调用线程必须拥有锁lock。第二次等待Wait允许设定的monitor监视器以原子方式解锁独立的监视器锁对象monitor lock object,并在第一个等待对象上阻塞对线程的调用。
    2、Wait等待将持续下去,即使超时也不会返回,直到可以再次获取监视器锁。Wait等待在经过较长时间后,如果锁定对象被另一个线程长时间持有held,之前的wait等待将可能返回false。Wait等待过程中,已恢复了返回的锁的递归级别。
    3、为了
正确释放一个等待线程,必须在传递给等待的完全相同的实例上调用Pulse以点亮全局脉冲信号灯,比如:TMonitor.Pulse(FSignal)。
    4、Pulse all的工作原理与Pulse相同,只是它将释放所有当前等待的线程。Wait/Pulse/PulseAll的变量与传统条件变量相同。
    关于TMonitor.Enter和TMonitor.Exit:
    1、用1个超时毫秒选项Enter进入监视器锁。在超时毫秒的时间内进入监视器锁。如果过程执行完毕且返回,则可以假定认为锁已获取了。
    2、用timeout选项将返回一个布尔状态,指示是否已获得锁(True)或尝试在获取锁之前超(False)。
    3、以无限时间INFINITE调用Enter与不带timeout选项调用Enter等效。
    4、TryEnter函数仅企图获取锁并立即返回,无论锁是否被获取到。
    5、带0毫秒timeout选项的Enter函数在功能上等同于TryEnter,相当于立即进入监视器锁。
    6、Exit可能会释放由Enter或TryEnter函数获取的锁。因为Enter/TryEnter是1个提供者rentrant,你必须成对匹配每个Eneter和相应的Exit退出调用。仅最后一个Exit退出调用会释放锁并让其他线程获得它。
    7、如果调用线程没有拥有锁lock而被Exit,运行时会报错reMonitorNotLocked。

    通常的调用格式TMonitor.Enter和TMonitor.Exit:
    TMonitor.Enter(AObject,0);
    AObject.Lock;
        //...你的代码...
    AObject.UnLock;   
    TMonitor.Exit(AObject);   

发布了80 篇原创文章 · 获赞 9 · 访问量 9858

猜你喜欢

转载自blog.csdn.net/pulledup/article/details/105175193