我希望得到关于如何设计Mac OS X网络内核扩展特定部分以实现最快和高效的建议或指导 - 使用C语言。
描述: 我有两组TAILQ列表。一组是A类型结构体,另一组是B类型结构体。 大多数情况下,我单独处理它们,因此为每个列表都有一个lock_mtx。有时,我需要修改A,然后是B,然后是同时修改两者。它看起来像这样:
Function1:
{
Modify List or Struct A
Modify List or Struct B
Modify List or Struct A & B
Modify List or Struct B
Modify List or Struct A
}
Function2:
{
Modify List or Struct B
Modify List or Struct A & B
Modify List or Struct A
Modify List or Struct A & B
}
我对于锁的使用不是很熟悉,所以我只看到两种选择:
- 使用一个锁来保护这两个列表。那样会浪费资源,因为它将阻止只修改A列表的函数在只修改B列表的函数执行时执行(反之亦然)。
- 连续获取并释放这两个锁。这将给我:
.
Function1:
{
lock A
Modify List or Struct A
unlock A
lock B
Modify List or Struct B
unlock B
lock A
lock B
Modify List or Struct A & B
unlock B
unlock A
lock B
Modify List or Struct B
unlock B
lock A
Modify List or Struct A
unlock A
}
我认为使用这么多锁会相当昂贵。有没有更好的方法来保护A和B的交叉修改?谢谢您的建议。