10

C#タグを使用してこの質問をしますが、可能であれば、どの言語でも可能であるはずです。

インターロック操作を使用して二重リンクリストを実装し、待機なしのロックを提供することは可能ですか?挿入、追加、削除、そしてクリアするのを待たずにしたいと思います。

4

9 に答える 9

16

はい、可能です。これが、C++でのSTLのようなロックフリーの二重リンクリストの実装です。

スレッドを生成してリストに対してランダムに操作を実行するサンプルコード

ABA問題なしで動作するには、64ビットのコンペアアンドスワップが必要です。このリストは、ロックフリーのメモリマネージャがあるためにのみ可能です。

12ページのベンチマークを確認してください。リストのパフォーマンスは、競合が増加するにつれてスレッドの数に比例して増加します。アルゴリズムは、互いに素なアクセスの並列処理をサポートしているため、リストサイズが大きくなると、競合が減少する可能性があります。

于 2011-07-06T20:04:06.610 に答える
11

単純なグーグル検索は、多くのロックフリーの二重リンクリストペーパーを明らかにします。

ただし、これらはアトミックCAS(コンペアアンドスワップ)に基づいています。

C#での操作がどれほどアトミックかはわかりませんが、このWebサイトによると

http://www.albahari.com/threading/part4.aspx

C#操作は、32ビットフィールドの読み取りと書き込みに対してのみアトミックであることが保証されています。CASについての言及はありません。

于 2009-05-11T20:06:03.860 に答える
4

これは、ロックフリーの二重リンクリストを説明 する論文です。

素並列アクセス可能であり、最新のコンピューターシステムで使用可能なアトミックプリミティブを使用する並行dequeの効率的で実用的なロックフリー実装を紹介します。以前に知られているdequesのロックフリーアルゴリズムは、使用できないアトミック同期プリミティブに基づいているか、機能のサブセットのみを実装しているか、互いに素なアクセス用に設計されていません。私たちのアルゴリズムは二重にリンクされたリストに基づいており、1語のコンペアアンドスワップのみが必要です...

ロス・ベンチーナには、「ロックフリーとウェイトフリーのアルゴリズムに関するいくつかのメモ」の多数の論文とソースコードの例で私が見つけた本当に良いリンクがいくつかあります。

于 2009-05-29T11:08:33.280 に答える
2

1回のショットで複数の参照を設定する必要があり、インターロックされた操作の能力が制限されているため、これが可能であるとは思いません。

たとえば、追加操作を実行します。ノードBをAとCの間に挿入する場合は、1つのアトミック操作でB-> next、B-> prev、A-> next、およびC->prevを設定する必要があります。インターロックはそれを処理できません。「B」の準備中に別のスレッドが挿入を決定する可能性があるため、Bの要素を事前設定しても役に立ちません。

この場合、ロックをなくそうとするのではなく、可能な限りきめ細かくロックすることに重点を置きます。

于 2009-05-11T20:03:28.280 に答える
1

脚注を読む-VS2010の最終リリースの前に4.0からConcurrentLinkedListをプルする予定です

于 2009-06-15T06:36:30.563 に答える
1

さて、あなたは実際にそれを行う方法を尋ねていません。ただし、C#でアトミックCASを実行できる場合は、完全に可能です。

実際、私は現在、C++で二重にリンクされた待機フリーリストの実装に取り​​組んでいます。

これがそれを説明する紙です。 http://www.cse.chalmers.se/~tsigas/papers/Haakan-Thesis.pdf

そして、あなたにいくつかの手がかりを提供するかもしれないプレゼンテーション。 http://www.ida.liu.se/~chrke/courses/MULTI/slides/Lock-Free_DoublyLinkedList.pdf

于 2011-06-15T22:57:26.490 に答える
1

ほとんどのアーキテクチャで、コピー可能なすべてのデータ構造に対してロックフリーアルゴリズムを記述できます[1]。しかし、効率的なものを書くのは難しいです。

私は、HåkanSundellとPhilippasTsigasによる.Net用のロックフリーの二重リンクリストの実装を作成しました。概念上、アトミックPopLeftをサポートしていないことに注意してください。

[1]:Maurice Herlihy:待機なしの同期の不可能性と普遍性の結果(1988)

于 2014-11-20T18:18:46.583 に答える
0

FWIW、.NET 4.0は、System.Collections.Concurrent名前空間にスレッドセーフな二重リンクリストであるConcurrentLinkedListを追加しています。ドキュメントまたはそれを説明しているブログ投稿を読むことができます。

于 2009-05-30T21:56:44.273 に答える
-1

答えは、「はい、可能ですが、難しい」という非常に深い資格があると言えます。あなたが求めているものを実装するには、基本的に、衝突がないことを保証するために操作を一緒にコンパイルする何かが必要です。そのため、その目的のための一般的な実装を作成することは非常に困難であり、それでもいくつかの重要な制限があります。正確なニーズに合わせた特定の実装を作成する方がおそらく簡単であり、それでも、決して「単純」ではありません。

于 2009-05-11T20:04:20.760 に答える