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