mach内核,锁的最佳用法

时间:2012-09-25 12:22:23

标签: macos locks kernel-extension

我正在寻找有关如何设计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. 连续取两个锁,然后释放它们。那会给我:
  2.    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的交叉修改?

    感谢您的建议。

1 个答案:

答案 0 :(得分:1)

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

嗯,事实证明使用内核级互斥的思想似乎是正确的调用,没有明确的答案。太多取决于函数的确切结构以及不需要在锁定环境中执行的辅助工作所花费的时间。

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

谢谢大家的帮助。