Your SlideShare is downloading. ×
0
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Lockfree Queue
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Lockfree Queue

2,958

Published on

Lockfree queue introduction in Japanese.

Lockfree queue introduction in Japanese.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,958
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
14
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Lockfree queue
  • 2. Lockfree って?
    • 線形リスト・スタック・キュー・木といったデータ構造はシングルスレッドでの利用が前提
    • 複数スレッドで共有する場合は mutex などでロックするのが一般的
    • 共有出来るデータ構造を並行データ構造と呼ぶ
  • 3. Lockfree って?
    • 線形リスト・スタック・キュー・木といったデータ構造はシングルスレッドでの利用が前提
    • 複数スレッドで共有する場合は mutex などでロックするのが一般的
    • 共有出来るデータ構造を並行データ構造と呼ぶ
    ロックを用いない並列データ構造を Lockfree データ構造と言う
  • 4. Lockfree queue は?
    • 共有するためにロックを用いないキュー (FIFO バッファともいう ) の事
    • Atomic 操作は TestAndSet 命令に依存
      • 比較して一致した場合に代入 を一気に行う命令
      • 比較して一致しなかった場合は何も行わない
      • CompareAndSet とも言う ( 以後 CAS と表記 )
    • バッファが空の時に deque 操作がブロックするかどうかの話とは無関係
  • 5. 基本戦略(1/3)
    • 線形リストの queue を実装
    • 節点のポインタを CAS で一息に差し替える
    • 複数の同時 enque も CAS によって直列化
    A B C1 C2 C3 CAS CAS CAS
  • 6. 基本戦略(2/3)
    • 結果的に一つの enque だけ成功する
    • 複数のスレッドが同時に同一の場所を書き換えようとしても破綻しない
    A B C1 C2 C3 成功 失敗 失敗
  • 7. 基本戦略(3/3)
    • 失敗した残りの enque は更新された末尾ノードをターゲットに再び CAS を実行する
    • 以後繰り返し
    • deque 側の手続きも基本的に同じ戦略
    A B C1 C2 C3 CAS CAS
  • 8. 初期状態
    • HeadとTailが同一のダミーノードを指す
    Tail Head Dummy NULL
  • 9. キューへの挿入(1/5)
    • ① Tailのnextに新規ノードを繋げる
    • ② Tailを更新する
    Tail Head Dummy New CAS ①
  • 10. キューへの挿入(2/5)
    • 1 ステップ目は更新出来るまで繰り返す
    • しかし Tail の更新は失敗しても放置
    • Tail が誰かによって先に更新された場合に失敗
    Tail Head Dummy New CAS ← 失敗するかも ②
  • 11. キューへの挿入(3/5)
    • ① だけ終わった状態では下記のようになる
    • ここで別のスレッドが enque,deque しにきた場合が問題
    Tail Head Dummy New
  • 12. キューへの挿入(4/5)
    • この場合は後続の enque,deque が訂正操作を行う ( 遅延メソッド )
    • ① を行ったスレッドによる Tail 更新はその代わり失敗するが、前述の通り放置
    Tail Head Dummy New CAS
  • 13. キューへの挿入(5/5)
    • 1ステップ目の操作のみを線形化ポイントとする事で並列性を高めている
    Tail Head Dummy New
  • 14. キューからの取り出し(1/5)
    • ①   Head の指している物の Next( つまり A) を確保
    • ②   Head を CAS ですげ替える ( 失敗したら①から )
    • ③  確保しておいた物を結果として返す
    Tail Head A B Dummy A ①
  • 15. キューからの取り出し(2/5)
    • ①   Head の指している物の Next( つまり A) を確保
    • ②   Head を CAS ですげ替える ( 失敗したら①から )
    • ③  確保しておいた物を結果として返す
    Tail Head A B A が deque される CAS A ② ③
  • 16. キューからの取り出し(3/5)
    • Aを保持していたノードが次のDummyになる
    • (自動的にそうなる
    Tail Head Dummy B
  • 17. キューからの取り出し(4/5)
    • 保持するノードが 1 つだけになった場合に Head と Tail が同一のノードを指す場合がある。
    • 具体的には enque 操作の①の CAS が完了した瞬間
    Tail Head Dummy A
  • 18. キューからの取り出し(5/5)
    • その場合は Tail を CAS にて更新させてからやり直す
    • よって Head が Tail を追い越すことは起こり得ない
    Tail Head Dummy A CAS
  • 19. まとめ
    • CompareAndSet を使って複数のスレッドが共有する FIFO を作る事ができます
    • ソースコードは github に上げました
    • デュアルコア環境 (AthlonX2 5000+) では mutex でロックして共有した std::queue より遅かったです…
    • ABA 問題とリソースのプールと GC が登場する LockfreeQueue の話は希望が有れば

×