我正在寻找有关如何设计 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
}
我不熟悉锁的使用。所以我只看到两个选项: 1. 使用一个锁来保护两个列表。那将是一种浪费,因为它会阻止仅修改 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 的交叉修改?
感谢您的建议。