C++ 多层SRWLock有效吗?

C++ 多层SRWLock有效吗?,c++,winapi,C++,Winapi,例如,此代码有效吗 SRWLOCK srwLockA; SRWLOCK srwLockB; ::InitializeSRWLock( &srwLockA); ::InitializeSRWLock( &srwLockB); ::AcquireSRWLockExclusive( &srwLockA ); // First level /* do some stuff with member A*/ ::AcquireSRWLockExclusive( &a

例如,此代码有效吗

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
srwLockA和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锁。它确实适用于某些类型的锁,例如互斥锁(当然,对于互斥锁,您可以使用
WaitForSingleObject
releasemotex
而不是
AcquireSRWLockExclusive
ReleaseSRWLockExclusive

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

FWIW,我对它的理解(在测试之前不能保证100%正确):

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

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


为什么它不起作用?我怀疑的原因是因为它的文档中有这一行“SRW锁是指针的大小。其优点是更新锁定状态的速度很快。缺点是可以存储的状态信息很少,因此无法递归获取SRW锁。此外,在共享模式下拥有SRW锁的线程无法将其锁的所有权升级为独占模式。“我不完全理解”递归获取的含义“谢谢你的回答,@immibis我想破坏临界区也能用是吗?@Control是的。一般来说,不同的锁彼此都不了解。(这也意味着您可以在关键区段内获得SRW锁)