Mac OS X ネットワーク カーネル拡張機能の特定の部分を可能な限り高速かつ効率的に設計する方法 (C 言語) に関するアドバイスや指針を探しています。
説明: 2 セットの TAILQ リストがあります。1 つはタイプ A 構造用、もう 1 つはタイプ 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. 単一のロックを使用して両方のリストを保護します。B のみを変更する関数が実行されている間に、A のみを変更する関数が実行されるのを防ぐため、これは無駄です (逆も同様です)。
- 両方のロックを連続して取得し、解放します。それは私に与えるでしょう:
.
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 の相互変更を保護するより良い方法はありますか?
アドバイスありがとうございます。