はロック(wait)無二重リンクリスト可能ですか?
-
21-08-2019 - |
質問
かこの質問とC#のタグが可能であればできるので、使用言語を問いません。
で実施する二重リンクリストを連結させた業務を提供しない待つ-ロックは期待できますか?使いたいと思っているの挿入、追加および削除、明確にせずにお待ちしております。
解決
シンプルなGoogle検索では、多くのロックフリー二重にリンクされたリストの論文を明らかにします。
しかしながら、それらは原子CAS(比較およびスワップ)に基づいています。
私はC#での操作がどのように原子知りませんが、このウェブサイトによると
http://www.albahari.com/threading/part4.aspxする
C#の操作は、唯一の32ビットのフィールドを読み書きについて、原子であることが保証されています。 CASのは言及しない。
他のヒント
はい、それは可能ですが、ここではSTLのような私の実装では、<のhref =「https://github.com/Qarterd/Honeycomb/blob/master/src/common/Honey/Thread/LockFree/List.h」ですrel = "nofollowをnoreferrer" C ++での>ロックフリー二重リンクリストでます。
リストの
これは、ABAの問題なく動作する64ビットのコンペアアンドスワップを必要とします。このリストは、理由はでのみ可能ですロックフリーメモリマネージャを。
<のhref = "http://docs.google.com/viewer?url=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.140.5222をチェック12ページの上%26rep%3Drep1%26type%3Dpdf」のrel = "nofollowをnoreferrer">ベンチマーク。リストのパフォーマンスは、競合が増加するにつれて、スレッドの数に比例して増大します。リストのサイズは、競合が低下する可能性が高くなるようなアルゴリズムは、ばらばらのアクセスのための並列処理をサポートしています。
ここ<のhref = "http://citeseer.ist.psu.edu/cache/papers/cs/32904/http:zSzzSzwww.cs.chalmers.sezSz~phszSzTechnicalReportszSzSunT04_Deque.pdf/sundell04lockfree.pdf" relがあります= "nofollowをnoreferrer">ロックフリーのdoubllyリンクリストをdiscribes紙に。
私たちは、効率的かつ実用的な提示します ロックフリーの実装を ある同時両端キュー 互いに素並列アクセスおよび使用 利用可能な原子プリミティブ 現代のコンピュータ・システムインチ以前に dequeの既知のロックフリーアルゴリズム いずれかの非利用可能に基づいています アトミック同期プリミティブ、 のみのサブセットを実装 機能性、またはをのために設計されていません ばらばらにアクセスします。当社のアルゴリズムは、 二重にリンクされたリストに基づいて、 唯一の単一ワードが必要です 比較交換...
ロスBencinaは、私はちょうど「<のhref =」http://www.audiomulch.com/~rossb/code/lockfree/「のrel =」nofollowをnoreferrerためnumerious論文やソースコードexcamplesで見つかったいくつかの本当に良いリンクがあります「>ロックフリーと待つフリーのアルゴリズム上のいくつかの注意がを」。
私はあなたが一発で複数の参照を設定するために抱えていることから、これが可能であるとは考えていない、との連動操作が自分の力に制限されています。
C-> PREV原子いずれかで使用すると、AとCの間のノードBを挿入している場合は、次> B->次に、B-> PREV、A-を設定する必要があり、かつ -は、例えば、追加操作を取ります操作。インターロックはそれを扱うことができません。別のスレッドがあなたが「B」を準備している間に挿入を行うことを決定する可能性があるのでプリセットBの要素であっても、役に立ちません。
私は、この場合にはできるだけきめの細かいロックを取得するに集中したい、それを排除しようとしていない。
脚注を読む - 彼らは4.0から前にVS2010の最終リリース
にConcurrentLinkedListを引くことを計画さて、あなたは実際にそれを行う方法を求めていません。しかし、あなたがC#で、原子CASを行うことができます提供し、それは完全に可能です。
実際、私はちょうど今C ++で二重にリンクされた待機フリーリストの実施を通じて働いています。
ここではそれについての論文があります。 http://www.cse.chalmers.se/~tsigas/papers /Haakan-Thesis.pdfする
そしてまた、あなたにいくつかの手がかりを提供することができるプレゼンテーション。 http://www.ida.liu.se/ 〜chrke /コース/ MULTI /スライド/ロックFree_DoublyLinkedList.pdfする
ほとんどのアーキテクチャ上ののすべてののコピー可能なデータ構造のための無料のアルゴリズム[1]を書き込みロックすることが可能です。しかし、効率的なものを書くのは難しいです。
私は<のhref = "http://www.researchgate.netの実装を書きました/出版/ 237782379_Lock-Free_and_Practical_Deques_and_Doubly_Linked_Lists_using_Single-Word_Compare-AND-Swap1" のrel = "nofollowを"> for .NETのホーカンSundellとPhilippas Tsigas のことでロックフリー二重にリンクされたリスト。それが原因コンセプトに、原子PopLeftをサポートしていないことに、注意します。
というか答えは非常に深く資格が"あり 可能, が、ハード.実施うまいん基本的に必要なものがコンパイルを操作するための少なくともない衝突どうもハードを一般的な実装を目的としたものである重大な限界がある。おもしろくするのもいいけど簡単な作りが特定の実装に合わせた正確なニーズもできたし、とても満足しているのではなく、"単純"の参考になればうれしいです。