読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

Mutexによる同期

日記 .NET

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

使い方として楽そうな構文があったのでメモ

http://d.hatena.ne.jp/kazuv3/20080923/1222116824