红鱼儿

kbmMW作者对于锁机制的论述

对于TkbmMWLock来说,下面详细说明这个默认的kbmMWREWLock机制是如何运作的?

 
线程1
      BeginRead
      Work for a longish time
      EndRead
线程2
      BeginWrite
      Do some work
      EndWrite
如果Thread1进入BeginRead,那么在上述情况下的BeginWrite将会被阻止,直到调用完EndRead。
如果锁被定义为读取优先(be biased towards readers),则允许来自其他线程的BeginRead操作,不会被阻止。BeginWrite将继续被阻止,一直到不再有BeginRead操作产生的锁。
我的理解:对资源来说,BeginWrite必须在其无锁状态下才会执行,否则一直被阻塞。
 
如果锁被定义为写优先(be biased towards writers),来自其他线程的BeginRead是允许的,但他一直被阻塞,直到EndWrite被执行。
 
另一个场景:
线程1:
      BeginRead
      Dosomething
      BeginWrite
      Dosomething
      EndWrite
      EndRead
如果在锁上启用写锁升级(write lock escalation)(默认),这会将读取锁定升级到写入锁定。
 
线程1:
      BeginWrite
      BeginRead
      EndRead
      EndWrite
因为写入锁已经存在,所以将简单地忽略BeginRead / EndRead调用。
 
可以使用通常表现较差的其他锁机制。
 
在kbmMWConfig.inc中定义下面其中之一:
//{$DEFINE KBMMW_SUPPORT_MRWSLOCK}
//{$DEFINE KBMMW_SUPPORT_MONITORLOCK}
{$DEFINE KBMMW_SUPPORT_FASTMRWSLOCK}
 
如果不定义,锁定将使用普通的TCriticalSection锁定,阻塞所有读写操作。
FASTMRWSLOCK 是默认的定义。


posted on 2020-11-27 17:03  红鱼儿  阅读(354)  评论(0编辑  收藏  举报