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 是默认的定义。