3

我正在寻找有关如何设计 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 的函数(反之亦然)。

  1. 依次获取两个锁,然后释放它们。那会给我:

.

   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 的交叉修改?

感谢您的建议。

4

1 回答 1

1

最初,我在上述问题的背景下寻找设计建议。

好吧,事实证明,使用内核级互斥锁似乎是正确的选择,没有明确的答案。太多依赖于函数的确切结构以及花费在不需要在锁定上下文中执行的副工作上的时间。

在这种情况下,由 dario_ramos 和 pmjordan 暗示的最佳答案是分析可行的选项并做出选择。

感谢大家的帮助。

于 2012-09-26T10:30:44.333 回答