Mergerの実装

複数のリストを1本のリストにマージする仕組みを実装。リストのセルに要求が入っているとして、受け手は要求を待ってブロックする。要求を出す側はそれぞれ自分のリストに要求を突っ込んでいくと、受け手側にはそれらがマージされて渡される。という感じ。

正確には、WorkPoolの逆で、Merger型の変数は内部に(現在の)リストセルへのポインタを持っていて、そこに値をputすると、現在のリストセルにwriteした上で、新しいセルを確保してリストにつなぎ、現在のリストセルとする、という感じで実現しています。

SyncList<T> *first = new SyncList<T>;
Merger<T> *m = new Merger<T>(first);
...
SPAWN(generator1(m));
SPAWN(generator2(m));
SPAWN(consumer(first));

とかすると、generator1, generator2では、単純に

m->put(val);

とすることで、consumer側でgenerator1, generator2がputした値を(firstからたどれる)リストから取り出すことができるようになります。

GUIプログラムなんかで、複数のプロセスからの要求を待ちたい場合、あるいはselect的な機能が欲しい場合に使えると思います*1

後は、この機能を使って、GUIプログラムを書いてみるか。

*1:上記の例では、generatorがMerger型の変数を直接操作していますが、これをSyncList型として、複数のSyncList型変数のリストからひとつのリストを作り出す、ということも、上記のMergerを使えばできます。この場合、マージするプロセスがリストの数だけ余計に必要になりますが。