スレッド系のバグ

まだまだやっちゃうもんですねぇ。
いろいろ操作を複雑にしながら、マウスレコーダーでごちゃごちゃ耐久試験をしていたら、発覚。マルチスレッドに関する部分での協調問題が発覚。


症状としては、
階段を下りる
サーバーから次の地図データが送られてくる。
前の地図データを削除して新しい地図データに切り替える。
その最中に画面の描画やら、マウスの操作やらが発生したときに、ぶっとぶ。
という問題。
うーん。どっかでクリティカルセクションが漏れていたのか。
ということで、ロックの機構の部分を再調査。数箇所見つかったのでさくっと修正。
ついでに、ATLでクリティカルセクションがどのように実装されているのかをお勉強。
ふ~ん。簡単じゃん。
一箇所疑問点があったので、友人にメッセで教えてもらう。
class ClassName
{
public:
void FuncName( arg…) throw();
};
の[throw()]って何だよ?そんな構文始めてみたぞ?
友人のありがたい助言によると、「その関数で投げられる例外の種別を示す構文」ということらしい。throw()はこの関数では例外を投げません。throw(…)はこの関数では任意の例外を投げます。ってことらしい。
へぇ、へぇ、へぇ。昔JAVAにそんな機構があって、コンパイラで例外のtry,catchを忘れているのをチェックしてくれたけど、C++にも似たような構造があったんだ。どうも、VC7からその手の拡張(というか標準に準拠)がなされたらしい。
いやぁ、普段から使い慣れているC++でもまだまだ知らないことっていっぱいあるんだねぇ。
というか知らないうちにどんどん標準C++の拡張もされているようで、ちゃんと情報を追いかけてないと、気が付いたら「なに、あの親父、そんな基本的なことも知らないのに、C++の経験が何年とか威張ってるわけ?」とかいわれちゃうわけね。
エンジニアは日々修行のようです。
先の構文に関する記述は、
DeepC++
の「C と C++ での例外処理、第 3 部」に詳しく出ています。
このドキュメントを探していて、見つけた面白そうなドキュメントたち。
Microsoft Visual Studio 技術資料   一般的な技術解説記事
New from MSDN Online columnists and feature writers
Standard Compliance Issues in Visual C++
じっくり勉強しなきゃ。。。

コメントを残す