読者です 読者をやめる 読者になる 読者になる

Software Transactional Memo

STM関係のことをメモっていこうと思います。

STMのPrivatization

Privatizeって和訳すると民営化だから全く意味が分からなかったけど最近意味がわかってきた。

PrivatizeというのはSTMが監視対象にしていたグローバルなデータを特定のスレッド固有のデータとして所有権を戻す操作の事を言う。STMの弾きだした結果に基づいてディスクIOやネットワーク通信などを行う事になるんだけど、その操作はSTMの中では行えない。そして「そんな人はデータをローカルに複製すればいいんじゃね?」「←そんな事言ってるからナイーブなユーザーがエンバグしたりSTMは遅いって罵られるんだよ!」的なやりとりがあったか無かったか分からないけど、複製をまるっと作らずともデータを外に出せるようにする需要があった。

またHTMとの過渡期の間はatomicブロック内はHTMが利用可能な場合はHTMで、それが不可能ならSTMでエミュレーション、という思想もあってHTMで動かした場合と結果が変わったら困るというのは自然な需要かも知れない。

コードで書くなら

std::list<int>* global_data;

--------------ThreadA

std::list<int>* local = NULL;

atomic {

  local = global_data;

  global_data = NULL;

}

some_work(*local);

--------------ThreadB

atomic {

  for(std::list<int>::iterator it = global_data->begin(); it != global_data->end(); ++it) {

    何か(it);

  }

}

----------------

こんな感じの操作をする際に、ThreadAがトランザクションに勝った場合、ThreadBがリストに対して直接なにか更新をしてしまうと事故が発生するのでローカルなWrite Setに代わりに更新を行うしか無い。衝突頻度が低いケースでのデータの投機的更新はSTMの高速化の有力な足がかりの一つだったけれどPrivatizationを意識するとそれは危険だよね、という事らしい。これに対する解決策もケースごとに整備されているけれど僕の理解が追いつかない。