同期

同等なGUIスレッドが複数ある、という作りは、完全に別のプログラムが同一のメモリ空間内で動いているつもりで作れば何も問題ないのですが、中途半端に色々共有しようとすると途端に厄介になります。
例えばウィンドウメニューひとつとっても、他のGUIスレッドから情報をかき集めてこないと実現できないわけです。ウィンドウ間でDiffやらGrepやらかけてる間は相手のGUIスレッドを止めとかないといけませんし。*1
ところで、スレッドが違うと得られない情報って結構あるわけです。Windowsはメッセージキューを始めとした一連のGUI情報がスレッドに属する設計ですし。そんなわけで開き直って相手のスレッドを扱うコードは相手のスレッドのコンテキストで実行するよう書き換え中。要するに関数ポインタをPostMessage。
ところが、ロック中にSendMessageとか走ってしまうと、デッドロックするわけです。上記のような侵入を意図しなくても、Windowsではウィンドウのテキストを得るような処理ですらメッセージが飛び交います。これがなかなか油断ができない。
しかしロックを解いてしまうと、関係ない他のスレッドが割り込んで書き換えてしまうとかあるわけです。
必要なのは、ロック状態をスレッド間で「受け渡す」処理…。
そんな理由もあってクリティカルセクションじゃなくてInterlocked〜で自前の排他処理を作ったのですが、調べれば調べるほどWindowsのスレッド回りの機構は案外充実してるので、ひょっとして既になんかありませんかね、都合の良いAPIが。
…じゃなくて、考えれば考えるほど、ロック状態をスレッド名指しで譲渡する機能はWindowsに限らず必要なんじゃないかと思えてくるのですが(特にAdaでランデブー中とか)、皆さんどうやってんだ。

*1:普通の人は、事細かに排他処理を入れていくんだと思います。私はずぼらなので、グローバル情報に関しては、ウィンドウプロシージャが走ってる間ずっとReadロック取っておいて、グローバル情報を更新する時だけWriteロックという、大雑把な排他処理で済ませています。この際ロック方法は何でもいいとしてください。