私は最近少しの文献を読んでいて、かなり興味深いデータ構造を見つけました。
更新時間を最悪の場合の更新時間まで下げるさまざまな方法を調査しました[1-7]。
最近、効率的な同時アクセスをサポートするために、ロックフリーのデータ構造の調査を開始しました。
これらの最悪の場合の更新時間技術は、ロックフリーデータ構造の実装に使用されていますか?
私が尋ねるのは; 私には、それらはこの「理論的強化」の明らかな実際的な拡張のように思えます。
私は最近少しの文献を読んでいて、かなり興味深いデータ構造を見つけました。
更新時間を最悪の場合の更新時間まで下げるさまざまな方法を調査しました[1-7]。
最近、効率的な同時アクセスをサポートするために、ロックフリーのデータ構造の調査を開始しました。
これらの最悪の場合の更新時間技術は、ロックフリーデータ構造の実装に使用されていますか?
私が尋ねるのは; 私には、それらはこの「理論的強化」の明らかな実際的な拡張のように思えます。
回答:
はそれ自体では役に立ちません。ロックフリーのデータ構造では、データ構造が変化したように見える場合、単一のアトミックインスタンスが必要です。すべての表現不変条件は、そのアトミックインスタントの直前と直後の両方で有効である必要があります。
つまり、データ構造を変更する場合、重要な特徴は、プライベートデータ構造ですべてのmodを実行し、単一のアトミック命令で変更をスワップできることです。
ロックフリーは、通常、データ構造が不変(純粋に機能的)である場合に最も簡単です。データ構造の現在のバージョンへのグローバルポインターを保持するだけです。読者は何もロックする必要はありません。データ構造への変更は、1つの不変データ構造へのグローバルポインターを別の不変データ構造にスワップすることによって行われます。
例:純粋に機能的なツリーバランスツリーがある場合:
最も重要な部分は、上で表現の不変式を維持する必要があると言ったことです。 通常、ツリーの中央でアトミックに変更を行うアルゴリズムを用意するだけでは不十分です。 どうして?たとえば、ツリーの先行順走査を実行中のリーダースレッドがあるとします。現在読み込んでいるノードの祖先であるノードを変更すると、それらが強制したと考えられる前提条件が無効になります。読者は、変更を加える前とまったく同じように、または変更を加えた後とまったく同じように、データ構造を操作できる必要があります。間にはありません。
while ( !P ) { noOp(); } doWork();
ところnoOp
かもしれsleep
または類似を。
Copy
ステップをアトミックにする方法は?それは別の難しい問題のようatomic snapshot
です。