「Haskellによる並列・並行プログラミング」を読み進めてきましたが、ようやく第15章、最後の章を読み終わりました。
15章「デバッグ、チューニング、外部コードとのインターフェース」
デバッグやチューニングの話はもう少し前の章でやってほしかった感じ。本書の後半を読み進める前にこの章を見ておけば良かったかも。
15.1 並行プログラミングのデバッグ
GHC.Conc
の threadStatus
関数でスレッドの状態が取得できます。通常の制御で利用するためのものではなく、デバッグ用。
GHC で -eventlog
オプションをつけてビルドすると、プログラム実行時に eventlog ファイルが出力されます。イベントログの内容を見るのは、この本で何度も出てきた ThreadScope を使います。あるいは、ghc-events
というツールでも見ることができます。このとき、labelThread
関数や traceEventIO
関数を利用すると、イベントログが見やすくなって便利です。
また、前の章でも出てきましたが、GHC はデッドロックを自動検出してくれます。しかし、検出できないデッドロックもあるので注意。
15.2 並行および並列プログラムのチューニング
GHC のスレッドは OS ではなくランタイムシステム内で管理される軽量スレッドです。生成にかかる時間、メモリ使用量、コンテキストスイッチの性能、どれも優秀なようです。さらに、RTS オプションによってランタイムシステムの微調整が可能です。
スレッド間でデータを共有する場合に、MVar
、TVar
、IORef
の3種類のコンテナがあります。それぞれ一長一短で、状況によって選択することになります。
15.3 並行性と外部関数インターフェース
Haskell から C の関数を呼んだり、C から Haskell の関数を呼んだりする話。あまり詳しいことは書かれていません。
C の関数を呼び出す場合、Haskell のスレッドでなく OS のスレッドが使われます。
場合によっては、特定の OS スレッドを使う必要が出てきます(1つは GUI ライブラリのように、メインスレッドで呼ぶ必要があるもの。もう1つは OpenGL のように状態をスレッドローカルに持つもの)。このために、束縛スレッドという仕組みが用意されています。
次回以降の予定
「Haskellによる並列・並行プログラミング」を読み終わったので、次回からは違う内容を始めたいと思います。