複雑なデータ構造をメモリ(キャッシュデータ)に保持するマルチスレッド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つの読み取りプロセスを同時に実行することもできなくなりました。
助言がありますか?
「これは書き込みとのみ衝突する読み取り専用アクション」Mutexのようなものはありますか?