さまざまなデータ構造と Web/アプリケーション サーバーの評価と再評価と計画を数か月行った後、実装の詳細について頭を悩ませる必要がある段階に来ました。私が直面している(現時点では理論的な)質問は次のとおりです。
ユーザーなどの C 構造体を格納するために GWAN の KV ストアを使用しているとします (正常に動作し、テスト済み)。これらのオブジェクトを KV から削除し、後で競合状態に遭遇することなくメモリから削除するにはどうすればよいですか?
これは私が現時点でいるものです:
スレッド A:
- 削除するオブジェクトを参照している他のオブジェクトをつかむ
- 参照を NULL に設定する
- オブジェクトを削除
スレッド B:
- オブジェクトの取得を試みます -> kv はオブジェクトを返す可能性があります。オブジェクトはまだ削除されていないためです
- オブジェクトで何かをしようとします->ここですでに削除されている可能性があるため、すでに解放されているメモリにアクセスしますか?
または発生する可能性のある何か:
スレッド B:
- オブジェクトを参照するものを取得する
- 参照に従ってください -> オブジェクトはここで削除されない可能性があります
- 参照で何かをする -> ここでオブジェクトが削除される可能性がある -> 問題
また
スレッド B:
- 削除されるオブジェクトを参照できる他のオブジェクトを取得しました
- まだ削除されていないグラブ オブジェクト
- オブジェクトへの参照を設定 -> オブジェクトはここで削除される可能性があります -> 問題
ロックを使用する以外に、このような状況を回避する方法はありますか? さまざまな生産者/消費者の状況、ハッシュテーブルなどを処理するアルゴリズムを説明するドキュメントの寛容さを見つけました...時には待機のない実装もあります(ロックフリーと待機の違いを示す良い例をまだ見つけていません) -無料ですが、概念的にはわかります)が、この種のものに対処する方法を理解できていません。
私はこれを考えすぎていますか、それともこれらすべての状況を回避する簡単な方法はありますか? データとストレージのレイアウトを好きなように自由に変更でき、プロセッサ固有の命令 (CAS など) を自由に使用できます。
前もって感謝します