More Related Content
PPTX
PPT
PPTX
PDF
PPTX
PPT
PPTX
PPTX
Viewers also liked
PPTX
What is jubatus? How it works for you? PPTX
PPT
PPTX
PPTX
PPTX
Similar to Lockfree Priority Queue
PDF
プログラミングコンテストでのデータ構造 2 ~動的木編~ PDF
PPT
PDF
PPTX
PPTX
PDF
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~ PDF
PDF
PDF
PDF
PFDS 10.2.1 lists with efficient catenation PDF
PPT
PPT
PDF
PDF
PPTX
PDF
FP習熟度レベルとFSharpxのIteratee PDF
Lockfree Priority Queue
- 1.
- 2.
- 3.
- 4.
構造 2 分木を用意する木の節ごとに atomic なカウンタが付いている 木の先端部にアイテムが保持される 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 アイテムを保持 Atomicに操作 できるカウンタ - 5.
- 6.
- 7.
- 8.
- 9.
- 10.
挿入操作同士の干渉 カウンタは atomicに操作するため共有しても問題ない 同一の先端部分に複数のアイテムを保存する場合だけが問題 具体的には先端部分に並行 FIFO などを取り付ければ解決 1 0 0 0 0 1 0 1 2 3 4 5 6 7 8 - 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
実装 木を配列で表現、データ実体も配列で保持 PriorityQueue のように配列の 2 番目を根として木を表現。上へ行くときは 2 で割り、下へ行くときは 2 倍した後で、右なら 1 足す。左ならそのまま。 同じ場所に複数挿入できるよう、 X[n] は FIFO で実装 h[1] h[2] h[3] h[7] h[6] h[5] h[4] X[0] X[1] X[2] X[3] X[4] X[5] X[6] X[7] - 23.
実装(挿入処理) void push(constT& item){ int priority = item.GetPriority(); // 0 ~ 8 の値が出る items[priority].enque(item); // 対応するアイテムリストに挿入 int index = priority + MAX; // 木のインデックスを獲得 while(index > 1){ // 根に達するまで木を登る if((index & 1) == 0) {// 左から登るのなら atomic_inc(&heap[index / 2]); // カウンタをインクリメント } index /= 2; // 1 段上る } } 案外簡単! - 24.
実装(取り出し処理) T getMin(){int index = 1; while(index < MAX){ // 末端に続くまで続ける int counter = heap[index]; if(counter > 0){ // カウンタが大きいなら if(CAS(&heap[index], counter, counter-1)){ index = index / 2; // 左下の枝へ }// CAS 失敗したらカウンタの取得からやり直し }else{ index = index / 2 + 1; // 右下の枝へ } } return X[index].deque(); } 案外簡単! - 25.
まとめ Lockfree なPriorityQueue について解説 Priority の最大値に制限がある 制限が無いバージョンも有るらしいので調べます 挿入・取り出しがどんなタイミングでオーバーラップしてもデータ構造が壊れません