第 16章スレッド

GStreamer は当然ながらマルチスレッド化されており、完全にスレッドセーフです。アプリケーションの開発を容易にするために、スレッド化に関係する内部要素のほとんどは、アプリケーションからは隠蔽されています。ただし場合によっては、アプリケーションからこうした内部要素の一部を操作したいこともあります。GStreamer では、パイプラインのいくつかの部分にまたがって、アプリケーションがマルチスレッドの使用を強制することができるようになっています。

16.1. どんなときにスレッドを使うべきか

スレッドの使用を強制したいケースはいくつか考えられます。ただし、すべてのエレメントでスレッドを 1 つ使うと、いくらかオーバーヘッドが生じます。したがって、このようなスレッドの使い方は、パフォーマンスを落とさないためにも考えられないでしょう。以下に示すのは、スレッドが特に有益ないくつかのケースです。

上の図には、"キュー" (queue) エレメントというものがいくつか登場しています。キューはスレッドの境界となるエレメントで、プログラマはキューエレメントを通じてスレッドの使用を強制することができます。そのために、世界中の大学のスレッドの授業で教えている古典的なプロバイダ/レシーバ・モデルを使います。このモデルを使うことで、キューエレメントは、スレッド間のデータスループットをスレッドセーフにする手段になるとともに、バッファとしても機能することになります。キューには、特定の用途のために設定できる GObject プロパティがいくつかあります。たとえば、エレメントに対して上限と下限のしきい値を設定することができます。下限のしきい値 (デフォルトでは無効になっています) 未満しかデータがない場合、出力はブロックされます。上限のしきい値より多くのデータがある場合、入力はブロックされるか、または (入力をドロップするように設定されている場合は) 入力はドロップされます。

キューを使うには (つまり、パイプライン内で 2 つの独立したスレッドの使用を強制するには)、"キュー" エレメントを作成し、作成したキューエレメントをパイプラインの一部として組み込みます。スレッドに関するあとの細々とした内部的なことは、GStreamer が面倒をみてくれます。