スレッドでよくやるミス<デッドロック>

スレッドプログラムでよくやるミスがあります。

メインスレッドでサブスレッドを起動し、
メインスレッドから、サブスレッドに中止命令を出したとき。
サブスレッドが比較的早く応答するときには、
メインスレッドで中止命令を出した直後に、
サブスレッドの停止待ちをすることがあります。

でも、サブスレッドの停止までの処理の中に、
メインスレッドで処理されるべきWindowsメッセージを
SendMessage で飛ばす処理が含まれていると、
SendMessage が処理されて戻るのを待ちますが、
いくら待っても SendMessage は処理されません。

メインスレッドは、サブスレッドの終了待ちループに突入しているため、
メッセージループが回っていないためです。

解決方法は、
1.メインスレッドのタイマなどでサブスレッドの終了待ちをするようにする
2.サブスレッドから SendMessage を使用する処理を使用しないようにする
3.サブスレッドの終了待ちの間にメッセージ処理を行う

上から順にインテリジェントなんだけど、
今回は、3で対処。
[PR]
by isoq | 2008-12-24 18:05 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< XNA Game Studio... Windows インストーラで... >>