Concurrent Revisions

  • 資料
  • 概要
    • スレッド内から x の値を見ると,スレッドが fork された時の値で変わらない
    • スレッド内から x に書いても,スレッド内でしか反映されない
    • fork した親が join(スレッド) すると,書き込みが親スレッドに反映
    • コンフリクト?
      • 基本は最も外側のブランチを採用
      • あるいは hyperobject(cilk) 的な merge
      • → 結果が決定的になる!!! 素晴らしい!!!
  • 実装
    • スレッドローカルな変数として revision を持つ (リビジョンは大体スレッドみたいなもの)
    • リビジョンは,root のセグメントと current のセグメントへのポインタを持つ
    • セグメントとは変更の束であり,一意のバージョン番号を持っている
    • versioned は 「バージョン番号→値」 のマップを持っていて,いろんなバージョンでの値を管理する
      • set はそれを追加するだけ
      • get はセグメントを上にたどりながら,そのバージョン番号の値もってるかなーってみる
    • fork はスレッド作ってリビジョン作ってセグメント作るだけ
    • join は
      • written になってる値をみてって親リビジョンに merge
      • 子リビジョンを release (オワコン)
      • 親リビジョンを collapse : セグメントだんだんだんを 1 つに潰して効率化