多层SRWLock有效吗?
Is Multi-layered SRWLock Valid?
例如,此代码是否有效?
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 可以这样使用。
这应该有效。
"Acquiring a lock recursively"表示获取同一个锁两次。示例:
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
和 ReleaseMutex
而不是 AcquireSRWLockExclusive
和 ReleaseSRWLockExclusive
)。
您可以获得多个不相关的锁,因为它们彼此之间一无所知。
FWIW,我对它的阅读(在测试之前不能保证 100% 正确):
SRWLock可以在同一个线程中获取,而同一个线程中的另一个SRWLock已经获取
SRWLock不能在同一个线程中重新获取,而同一个SRWLock已经在同一个线程中获取;最有可能的是,这种递归获取同一锁的尝试将导致无限的自死锁(类似于 *nix 中的非递归互斥锁)。
例如,此代码是否有效?
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 可以这样使用。
这应该有效。
"Acquiring a lock recursively"表示获取同一个锁两次。示例:
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
和 ReleaseMutex
而不是 AcquireSRWLockExclusive
和 ReleaseSRWLockExclusive
)。
您可以获得多个不相关的锁,因为它们彼此之间一无所知。
FWIW,我对它的阅读(在测试之前不能保证 100% 正确):
SRWLock可以在同一个线程中获取,而同一个线程中的另一个SRWLock已经获取
SRWLock不能在同一个线程中重新获取,而同一个SRWLock已经在同一个线程中获取;最有可能的是,这种递归获取同一锁的尝试将导致无限的自死锁(类似于 *nix 中的非递归互斥锁)。