Gauche:control.jobメモ

Gauche:control.jobメモ

Shiro: 0.9.2のcontrol.job (GaucheRefj:control.job) にrace condition が見つかったんだけど、どうfixすれば良いかというのを考えてたら そもそもcontrol.jobをなぜ作ったかって当初の目的をだいぶ忘れてることに気づいたんで、 思いだしがてらメモしておく。

control.jobは単独で何か役に立つモジュールではない。ただ、control.* として いくつか考えてたライブラリがあって、それぞれに共通して使える構造があるなあと 思ってそれをくくりだしておいたもの。

さらに、アプリケーションによってジョブの管理方法が違ってくる。

そんでもって、複雑な待ち合わせモデルはいらないからとにかく速く実行したい、っていうアプリのために、必要無い場合はmutexでの待ち合わせとかデータ構造のアロケートとかはしなくても良いようにしたい。job構造体のアロケートでさえ、必要ならプリアロケートしておいて、実行中はノーアロケーションでいけるようにもしたい。

ってなことを考えてた。

やりっぱなしモデルや双方向キューモデルで、ジョブ実行中の干渉を許さないとすれば、 job-statusとjob-resultを書き込むのはジョブを実行しているスレッドだけで、 それが読まれるのはジョブ実行が終了した後なので、書き込みにmutexは必要ない。

job-mark-killed!みたいに途中で別のスレッドが干渉するとか、job-waitで別の スレッドが状態をチェックしにくるとかいう時だけ、mutexが必要になる。

そこをjob作成時にきちんと宣言させて、それによって場合分けをちゃんとやらんといかん。


少し整理して、スレッドとの干渉についてjobに3つのフレーバーがある、 というふうに定義することにした。

More ...