Mutexによる同期
VOICEROID(東北ずん子・結月ゆかり)で同時に何か喋らせようとした時に、クリップボードをお互い参照している。
この貼り付けのタイミングによっては上手く貼り付けができなかったり、隣のメッセージを貼り付けてしまったりする。
しかもこの2つはインスタンスもスレッドも異なるので、まずlock(Monitor)は使いにくい。これは同期オブジェクトの使用権を使ってロックする処理だ。
問題はロックしたい対象がアプリケーション外のリソースだということだ。DBならそれでもTransactionはあるのだが、クリップボードでは手が出ない。
ロック用の参照がロックしたい競合部分に参照として届く必要がある点がネックだ。問題がないパターンで言うなら1クラスオブジェクト内で複数スレッドを実行する場合だ。リソースの競合を避ける意味ではこれでよい。問題のあるパターンはスレッドを1クラスブジェクととして固めてしまった場合だ。こうするとスレッド間にそれぞれ同じ参照を持つことがない。これにはActorモデル(エージェントモデル)も同様だ。
これで処理を直列化+排他する必要が有るというのは、他プロセスへの手続き動作に当たる。
こんな時に使うのは Mutex だ。これは本来プロセス間排他するためのもので、多分 Monitor より実行コストが高い。とはいえ、相互に内部リソースに干渉しないスレッド間は、個別のプロセスっぽくも見えるのでいいのかなと思わなくはない。
使い方として楽そうな構文があったのでメモ