モーダルダイアログでデッドロック?
以前から気になっていたのだが、原因がよくわからなかった。
たとえば、gpg.exeをwin32のプログラムから呼ぶ場合、gpg.exeの標準エラー出力と、status-fdへの出力を両方とも拾いたくなることがある。
status-fdと標準エラー出力をまぜて一つのパイプに書き出すという手もあるが、status-fdはstatus-fdで処理したいので、分けて書き出すものとする。
この場合、マルチスレッドを使って、両出力を読み出すと、うまくいきそうな気がしていたのだが、たとえば標準エラー出力をどこかのウインドウに書き出していて、そこにstatus-fdを読み込んでいる別スレッドから何かのメッセージを書き込もうとすると、デッドロックになってしまう現象が見られた。
どこかの掲示板で、これをやるとデッドロックになると書いてあったような気がするのだが、うろ覚えだ。
JanusHSなどでは解決がつかなかったため、無理やりシングルスレッドで処理したりしていたのだが、今日、これは、メッセージの表示にモーダルダイアログを使っているのが原因なのではないかと思い至った。
が、検証用コードを書いている時間がなかったので、後日、テストすることにする。
というわけで、ここに備忘録代わりに書いておく。
たとえば、gpg.exeをwin32のプログラムから呼ぶ場合、gpg.exeの標準エラー出力と、status-fdへの出力を両方とも拾いたくなることがある。
status-fdと標準エラー出力をまぜて一つのパイプに書き出すという手もあるが、status-fdはstatus-fdで処理したいので、分けて書き出すものとする。
この場合、マルチスレッドを使って、両出力を読み出すと、うまくいきそうな気がしていたのだが、たとえば標準エラー出力をどこかのウインドウに書き出していて、そこにstatus-fdを読み込んでいる別スレッドから何かのメッセージを書き込もうとすると、デッドロックになってしまう現象が見られた。
どこかの掲示板で、これをやるとデッドロックになると書いてあったような気がするのだが、うろ覚えだ。
JanusHSなどでは解決がつかなかったため、無理やりシングルスレッドで処理したりしていたのだが、今日、これは、メッセージの表示にモーダルダイアログを使っているのが原因なのではないかと思い至った。
が、検証用コードを書いている時間がなかったので、後日、テストすることにする。
というわけで、ここに備忘録代わりに書いておく。
この記事へのコメント