言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

スレを止めないで

人のプログラムを沢山読んでると、まずいプログラムのバリエーションというのはそんなに沢山無い物だなあという気がする。現実の人生では人それぞれ独自性に富んだ失敗経験があるのに、プログラムの中で画期的な失敗に出会う事は少ない。

よくある不味いプログラムのパターンに、スレッドを外から止めてしまうという物がある。Squeak では Process>>terminate 。これが書いてある奴はまず臭い。昔よく、goto を使ってはならないと言われたが、このスレッド停止も API から消してしまえば良いのにと思う。こういうのは言語非依存な知識だと思うが、Java の人もはっきり言っている。http://java.sun.com/j2se/1.4/ja/docs/ja/guide/misc/threadPrimitiveDeprecation.html

わざわざマルチスレッドにしているという事は、中で通信やファイル操作など待ち時間のある I/O を行っているという事で、最初からデッドロックの可能性がある。内部状態を注意深く制御しないとやばいのに外から急に止められて良いはずが無い。通信相手に肩透かし、キューは取りこぼし、ファイルは開けっ放し。止まった時の偶然に左右されるような状態をプログラムの中に入れるとバグの原因になる。

スレッドを外から停止する正しいやり方は、スレッドの状態を表す変数を一つ用意して、その変数を必要に応じてチェックしてスレッドを継続するかどうか自分で決め、自然に終了する方法だ。何事も自然がよろしい。terminate はもう勘弁して欲しい。