質問

メモリ内に複雑なデータ構造(キャッシュデータ)を保持するマルチスレッドC ++アプリケーションがあります。

データを読んでいる間、すべてが素晴らしいです。データにアクセスしたい数のスレッドを持つことができます。

ただし、キャッシュされた構造は静的ではありません。

  • 要求されたデータ項目が利用できない場合、データベースから読み取られ、データツリーに挿入されます。これはおそらく問題ではなく、ミューテックスを使用して、数サイクルしかかからない新しいデータ項目をツリーに追加しても(ポインタを追加するだけです)。
  • 時々実行されるガベージコレクションプロセスがあります。ツリーから古いアイテムをすべて削除します。そのためには、すべてをロックダウンして、他のプロセスが現在メモリから削除されるデータにアクセスしていないことを確認する必要があります。また、キャッシュからの読み取り中にツリーをロックする必要があります。これにより、処理中にアイテムが削除されないようにします(「同じこと」とは逆です)。

"擬似コード":

function getItem(key)
   lockMutex()
   foundItem = walkTreeToFindItem(key)
   copyItem(foundItem, safeCopy)
   unlockMutex()
   return safeCopy
end function

function garbageCollection()
   while item = nextItemInTree
      if (tooOld) then
         lockMutex()
         deleteItem(item)
         unlockMutex()
      end if
   end while
end function

面倒なこと:これは、読み取り中にツリーをロックする必要があることを意味します(読み取り中にガベージコレクションが開始されないようにするため)。ただし、副作用として-もう2つの読み取りプロセスを同時に持つことはできません。

提案はありますか

ある種の「これは書き込みのみと衝突する読み取り専用アクションです」ミューテックス?

役に立ちましたか?

解決

読み取り-書き込みロックをご覧ください。

使用できるフレームワークは指定しませんでしたが、両方とも pThread および boost はそのパターンを実装しています。

他のヒント

コンセプトは、他の人が述べているように、"共有リーダー、シングルライター" ロックです。 Linux環境では、 pthread_rwlock_t フレームワークなし。 boost :: shared_lock も同様です。

リーダー/ライターロックをお勧めします。アイデアは、「読む」ためのロックを取得できるということです。または「書き込み」の場合、ロックは複数のリーダーを許可しますが、ライターは1人のみです。非常に便利です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top