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

自由課題

学んだり、考えたり、試したりしたこと。

ファイバ・コルーチン実装まとめ

リアクティブプログラミングを行うにあたって、並行処理の方法としてマルチスレッドモデルではなくファイバ(またはコルーチン)を使うことがひとつのポイントに思えたので調査してみました。なお、範囲は普段自分がよく使う言語ということで、C/C++/Ruby/Javascriptにしました。

ちなみにWikipediaによるとファイバ・コルーチンは以下のような定義になっています。
ファイバー (コンピュータ)
コルーチン
個人的な解釈としては、コルーチン・ファイバは並行プログラミングの手法の一種であり、並行実行される処理コンテキストスイッチをトリガする点が特徴かなと思います。(対して、一般的なスレッドはOSや処理系がコンテキストスイッチを担当します。)

例えば以下のような感じでプログラミングします(Ruby)。

n = 0

fib = Fiber.new {
  n+=1
  Fiber.yield

  n+=2
  Fiber.yield
}

puts "n is #{n}"

fib.resume
puts "n is #{n}"

fib.resume
puts "n is #{n}"

実行結果は以下です。

n is 0
n is 1
n is 3

Fiber.newするとファイバが作成され、作成した側でresumeするとFiberに処理が移り、Fiber内でyieldされるとFiberを作成した側に処理が戻っていることがわかります。このようなスタイルにすることで、mutexなどの処理が不要となり、(少なくともプロセッサ単位では)効率的になります。

ということで本題のまとめです。まとめといいながらあまり数がないですね。

各実装ともなるべく簡単に使えるように、テンプレートやブロックなど、言語仕様を活用して工夫しているようです。C言語のものも、POSIXのpthreadを意識したAPI構成するなど、理解しやすいようにしているように見えます。
システム全体の処理効率という観点から見ると、なるべく下位層からファイバやコルーチン実装になっていたほうが良さそう。