C++:递归锁——有什么缺点吗?
C++: Recursive locks - are there any drawbacks?
背景:我有几个线程应该访问共享数据。其中一个线程可能会锁定一个 Mutex,并且在互斥块内,(同一线程的)某些函数可能会再次调用同一个锁。
-我不想创建很多互斥体
-我不想放弃锁定(显然)
-我不想改变设计,因为它是一个很大的变化
void funcB()
{
lock(MA);
...
unlock(MA);
}
void funcA()
{
lock(MA);
...
funcB();
...
unlock(MA);
}
看来唯一的办法就是使用递归锁。使用此功能有什么缺点吗?
当然,如果您想到其他解决方法,欢迎分享
are there any drawbacks?
轻微的性能损失 - 如果您关心,请测量。
any other way to solve
您可以给 funcB
一个 bool should_lock = true
论点,或者主题的许多变体,例如有一个锁定互斥锁的重载然后调用另一个期望引用已锁定互斥锁的重载(可能使用断言来检查它在调试版本中是否被锁定):然后 funcA
可以调用后者。
背景:我有几个线程应该访问共享数据。其中一个线程可能会锁定一个 Mutex,并且在互斥块内,(同一线程的)某些函数可能会再次调用同一个锁。
-我不想创建很多互斥体
-我不想放弃锁定(显然)
-我不想改变设计,因为它是一个很大的变化
void funcB()
{
lock(MA);
...
unlock(MA);
}
void funcA()
{
lock(MA);
...
funcB();
...
unlock(MA);
}
看来唯一的办法就是使用递归锁。使用此功能有什么缺点吗?
当然,如果您想到其他解决方法,欢迎分享
are there any drawbacks?
轻微的性能损失 - 如果您关心,请测量。
any other way to solve
您可以给 funcB
一个 bool should_lock = true
论点,或者主题的许多变体,例如有一个锁定互斥锁的重载然后调用另一个期望引用已锁定互斥锁的重载(可能使用断言来检查它在调试版本中是否被锁定):然后 funcA
可以调用后者。