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);   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专讲冷知识

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值