1

私はc++で並行リンク(単一)リストを実装しようとしています。以前に同様の課題を抱えていた可能性のある人とのいくつかのポイントを明確にしたいと思います。背景:当初、リストはスキップリストの一部であることが計画されていましたが、スキップリストはメモリ内インデックスの一部でした。私がこれを実装し始めたとき、スキップリストのほかに使用できる一般的なソリューションを(stlのような方法で)作成しないのはなぜだと思います。しかし、並行コンテナーの動作方法は、シングルスレッドのものとは大きく異なる可能性があるようです。たとえば、挿入および削除操作では、std :: listの入力引数としてイテレータを使用しますが、同時実装の場合、別のスレッドがその近くのリストを変更すると、イテレータは無効になります。

リストがスキップリストの「レイヤー」である場合、この場合はソートされ、イテレーターを回避できるため、問題はありません。しかし、誰かが問題がどのように解決されたか一般的な解決策を実装しようとしたかどうか私は興味があります。

別の質問..そのようなコンテナをstlアルゴリズムと互換性のあるものにすることは価値がありますか?それらのほとんどは、並行性が原因で失敗する可能性があるようです。

前もって感謝します!

4

1 に答える 1

0

std::listインターフェイスを実装し、stlアルゴリズムと完全に互換性のある同時リンクリストコンテナを作成するのは非常に簡単です。操作ごとにすべてをロックするだけです。当然、これはロックフリーではなく、これはあなたが望むものではありません。

重要なのは、並行性が本質的に実装不可能になるわけではないstd::listということです。それを難し​​くしているのは、特定の実装の詳細であり、ロックフリー基準によってこれが難しくなる可能性があります。これを完全std::listに行う必要があるのは、そうすることが理にかなっている場合のようです。特にこのインターフェースでは、リストを変更する間、すべてのイテレーターが有効である必要があるため、ここでは少し厄介になる可能性があります。これを実装するために使用しているロックフリーアルゴリズムがわからないため、コメントすることはできません。

イテレータの保証が満たされている限り、コンテナが実装されていなくても、コンテナはstd::liststlアルゴリズムと互換性があるため、問題はそれらのイテレータの保証満たされていることを確認することであるように思われます。

于 2013-02-02T20:17:12.060 に答える