多层SRWLock是否有效

Is Multi-layered SRWLock Valid?

本文关键字:有效 是否 SRWLock 多层      更新时间:2023-10-16

例如,这段代码有效吗?

SRWLOCK srwLockA;
SRWLOCK srwLockB;
::InitializeSRWLock( &srwLockA);
::InitializeSRWLock( &srwLockB);
::AcquireSRWLockExclusive( &srwLockA );      // First level
/* do some stuff with member A*/
::AcquireSRWLockExclusive( &srwLockB );      // Second level
/* do some stuff with member A & B */
::ReleaseSRWLockExclusive( &srwLockB );        // Second level
/* do some stuff with member A**/
::ReleaseSRWLockExclusive( &srwLockA );      // First level

srwlockka和srwLockB分别保护成员A和成员B。我只是想知道SRWlock可以这样使用

应该可以。

"递归获取锁"意味着两次获取同一个锁。例子:

SRWLOCK lock;
::InitializeSRWLock( &lock );
::AcquireSRWLockExclusive( &lock ); // acquire the lock
// Now we have the lock
::AcquireSRWLockExclusive( &lock ); // acquire the lock again!?
// Now we still have the lock
::ReleaseSRWLockExclusive( &lock ); // release the lock
// Now we STILL have the lock?
::ReleaseSRWLockExclusive( &lock ); // release the lock again
// Now we don't.

这对SRW锁不起作用。它确实适用于某些类型的锁,例如互斥锁(当然,对于互斥锁,您将使用WaitForSingleObjectReleaseMutex而不是AcquireSRWLockExclusiveReleaseSRWLockExclusive)。

可以获取多个不相关的锁,因为它们彼此不了解。

我对它的阅读(在测试之前不能100%保证是正确的):

  • SRWLock可以在同一线程中被获取,而同一线程中的另一个SRWLock已经被获取

  • SRWLock不能在同一线程中被重新获取,而相同的 SRWLock已经在同一线程中被获取;最有可能的是,这种递归获取同一锁的尝试将导致无限的自死锁(类似于*nix中的非递归互斥锁)。