背景:我有几个应该访问共享数据的线程。 其中一个线程可能锁定互斥体,并且在互斥块中,(同一线程的)某些函数可能再次调用完全相同的锁。
-我不想创建很多互斥体
-我不想放弃锁定(显然)
-我不想改变设计,因为这是一个很大的变化
void funcB()
{
lock(MA);
...
unlock(MA);
}
void funcA()
{
lock(MA);
...
funcB();
...
unlock(MA);
}
看来唯一的办法就是使用递归锁。 使用这个功能有什么缺点吗?
当然,如果你想出了其他解决这个案子的方法,请分享
有什么缺点吗?
轻微的表现惩罚--如果你在乎的话。
有没有其他解决办法
您可以给funcb
一个bool should_lock=true
参数,或者主题的许多变体,例如,让一个重载锁定一个互斥体,然后调用另一个重载,该重载期望引用一个已经锁定的互斥体(也许使用一个assert检查它在调试构建中是否锁定):然后funca
可以调用后者。