並行処理サポート

色々考えてはいるものの、難しい問題が多い…

  • GTK+のようなツールキットを使うと、たいてい「何とかmain」のようなシステムが提供するイベント待ちループを実行する。で、並行に仕事を行うため何かをforkしたとして、その完了を知るためには、イベント待ちループ内で完了を知る必要がある、多分。GTK+の場合はファイルディスクリプタがread可能になったかどうかもイベントとして(?)受け付けることができるみたいなので、これを利用するんだろうけど、例えばsocketから読み出すプロセスを別に立ち上げたとして、socket読み出しプロセス→Sync変数(セマフォ)→別のラッパープロセス(セマフォ待ちのため)→待ち合わせ用ファイルディスクリプタに書き込み、とかする必要があって、そもそもsocketのfdを使っていれば一発で済むことになにをこんな手間をかけるのかという気に…
  • 裏で何か重い処理をやっていたとして、UIから、時間がかかりすぎるのであきらめてキャンセルする、という処理をしたいとする。普通に考えるとプロセスをkillすることになりそうだけど、それでいいのか?普通スレッドの場合はpthread_cancelでcancel pointとなる部分をプログラム中に作りこむ必要があるのだが。これって、セマフォロック中にkillしたらまずいという話?だとすると、System V IPCのセマフォはプロセス終了時にセマフォの値を「調整」する機能があるので、例えばロック中にkillされたらunlockする、ということは実現できる。しかし、ロックで保護している中で落とされるとまずいことが起こりそうではある*1。なんか、手間がかかるし見落としもありそうで怖い。茨の道じゃのぉ*2

*1:今ちょっと調べたらJavaのスレッドも似たような感じだな(Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle)。結局外から止めたい場合は、例えば止められる側でそれを示す変数を時々チェックする、というのが安全な方法か。でもそれじゃあなぁ。

*2:追記:良く考えたら、共有メモリの確保中にkillされるだけで駄目じゃん。free list管理しているので、サイズ・ポインタ書き換えが中途半端なところでkillされるとあさってなことに。やっぱり止めるところはプログラマが明示しないと駄目か。