Haskellによる並列・並行プログラミング読書会 #17 を開催しました #umekitahs

umekitahs.connpass.com

Haskellによる並列・並行プログラミング」を読み進めてきましたが、ようやく第15章、最後の章を読み終わりました。

15章「デバッグ、チューニング、外部コードとのインターフェース」

デバッグやチューニングの話はもう少し前の章でやってほしかった感じ。本書の後半を読み進める前にこの章を見ておけば良かったかも。

15.1 並行プログラミングのデバッグ

GHC.ConcthreadStatus 関数でスレッドの状態が取得できます。通常の制御で利用するためのものではなく、デバッグ用。

GHC-eventlog オプションをつけてビルドすると、プログラム実行時に eventlog ファイルが出力されます。イベントログの内容を見るのは、この本で何度も出てきた ThreadScope を使います。あるいは、ghc-events というツールでも見ることができます。このとき、labelThread 関数や traceEventIO 関数を利用すると、イベントログが見やすくなって便利です。

また、前の章でも出てきましたが、GHCデッドロックを自動検出してくれます。しかし、検出できないデッドロックもあるので注意。

15.2 並行および並列プログラムのチューニング

GHC のスレッドは OS ではなくランタイムシステム内で管理される軽量スレッドです。生成にかかる時間、メモリ使用量、コンテキストスイッチの性能、どれも優秀なようです。さらに、RTS オプションによってランタイムシステムの微調整が可能です。

スレッド間でデータを共有する場合に、MVarTVarIORef の3種類のコンテナがあります。それぞれ一長一短で、状況によって選択することになります。

15.3 並行性と外部関数インターフェース

Haskell から C の関数を呼んだり、C から Haskell の関数を呼んだりする話。あまり詳しいことは書かれていません。

C の関数を呼び出す場合、Haskell のスレッドでなく OS のスレッドが使われます。

場合によっては、特定の OS スレッドを使う必要が出てきます(1つは GUI ライブラリのように、メインスレッドで呼ぶ必要があるもの。もう1つは OpenGL のように状態をスレッドローカルに持つもの)。このために、束縛スレッドという仕組みが用意されています。

次回以降の予定

Haskellによる並列・並行プログラミング」を読み終わったので、次回からは違う内容を始めたいと思います。