KILLコマンドのタイムラグ

SHOW PROCESSLISTを実行して、実行中のスレッドの状態を調べ、フリーズしている(あるいは処理時間が異様に長い)と思われるスレッドはid指定してKILLできるわけですが、このKILLコマンド発行から実際にスレッドがKILLされるまでにはタイムラグが生じることがあります。

なぜかというと、、、

while (!(error=info.read_record(&info)) && !thd->killed)

KILLコマンドを処理するスレッドと、その問題のスレッドは別スレッドであり、このようにwhileループのなかでTHDオブジェクト(スレッド記述子)に"killed"がマークされているかどうかで、KILLされる側が判断して処理しているからです。

こういったCのプログラムに限らず、Javaでもそうですが、こうしたKILLされる側自身によるチェックを使ったKILLというのは、タイムラグがあるだけでなく、そのループの中の関数処理にフリーズの原因がある場合には、KILLできないという構造的欠点があります。

Javaでとあるプログラムを作っていたときはこうした構造的欠点に対処可能とするために、非推奨Thread.stop()メソッドを呼び出す仕組みにしていました。

話がそれましたが、タイムラグの原因は何なんだろうな〜と思っていたらこういうわけでした。