多层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
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锁不起作用。它确实适用于某些类型的锁,例如互斥锁(当然,对于互斥锁,您将使用WaitForSingleObject
和ReleaseMutex
而不是AcquireSRWLockExclusive
和ReleaseSRWLockExclusive
)。
可以获取多个不相关的锁,因为它们彼此不了解。
我对它的阅读(在测试之前不能100%保证是正确的):
-
SRWLock可以在同一线程中被获取,而同一线程中的另一个SRWLock已经被获取
-
SRWLock不能在同一线程中被重新获取,而相同的 SRWLock已经在同一线程中被获取;最有可能的是,这种递归获取同一锁的尝试将导致无限的自死锁(类似于*nix中的非递归互斥锁)。
相关文章:
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 检查由括号、方括号和大括号组成的一组方括号是否有效?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 模板签名解析为 void(void) 被 GCC 拒绝;这是否有效C++?
- 我如何知道作为参数的size_t在函数中是否有效?
- 是否可以在C++中获取 CHAR 的有效十六进制地址?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 模板变量是否允许在多个翻译单元中并有效合并?
- 错误:在尝试检测 std::cout 是否<< t 时,功能强制转换为数组类型;有效
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 此递归模板类型定义是否有效C++?
- 将 C 函数转换为 C++ 以检查数字是否有效
- 函数参数的名称与调用函数时使用的变量相同是否有效?
- 如何检查输入是否有效?
- 如何检查用户的输入是否有效以及我正在寻找的数字?
- 堆分配对于大型块中的分页是否更有效?
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- 如何检查isupper(cstr)是否有效?