汎用の落とし穴

今日はデータ表示ソフトの不具合の調査。

数年間、調子よく動いていたソフトが最近になって不具合が出だした。ときおり5〜6秒間完全に止まってしまうのだ。

原因を探るのに苦労した。なにせデバッガまで止まってしまうのである。凍ったときにデバッガ側から停止させても、凍っているところから少し処理が進んだところで停止してしまい、問題の場所どこか正確にわからない。ついでにスレッドが4つも走ってるから、さらによくわからない。


最後の手段「ソースのあちこちにデバッグ出力コードを埋設作戦」を決行し、ようやく犯人の潜伏場所が判明した。


なんとdequeのpop_front()である。


データを一個削除するだけのpop_front()でなぜ5〜6秒も止まるのだ。しかもここではMutexを使って排他制御をかけているので、他のスレッドまで止まる。そりゃ完全に止まるわけだ...


で、pop_front()で止まる理由ですが、ガーベージコレクションしてやがりました。STLではそんな雑多な内部処理は隠蔽されてるから気づかなかった。


どうして最近になって現象が出だしたのかというと、データを出力するハードウェアがバージョンアップされて、以前は1秒間に2000点ほどだったデータが今では1秒間に5000点になっているせいでした。データ数が倍増したせいで今までは出なかった問題がようやく表出したんですね。


とりあえずdequeで実装していた部分を独自仕様のリングバッファに書き換えたら問題は出なくなりました。




ふぅ。