原です。
In message "[ruby-list:14829] Re: ConditionVariable (again)"
on 99/06/05, Shugo Maeda <shugo / netlab.co.jp> writes:
|
|前田です。
|> Mutex を使うのは
|>
|> 1. あるリソースの操作を排他処理したい
|>
|> 時だとよく言われますが、もうひとつ大事な条件として
|>
|> 2. しかしそのリソースの操作をしないスレッドは動き続けてほしい
|>
|> 時、というのがあると思います。むしろ 2. が重要なのではないかと。
|
|というか、スレッドを使っている場合はなるべく並列度は下げたくない
|ので、Mutexで十分な場合はMutexを使うだけですませる、という手法を
|使うのではないでしょうか。
チュートリアルの件のコードでいえばループの回るスピードは
Thread.exclusive の方が Mutex#synchronize に比べて3倍近く速いで
す。(Linux で。当社比。^^;)ということは、exclusive{} は、その部
分だけではスケジュールを握っているけど、全体としては他のスレッド
に動く時間と機会を多く与えているわけですよね。
|つまり、原さんは「わざわざ他のスレッドを動かし続けなくても」とい
|う意識でいらっしゃるのだと思うのですが、普通は「わざわざ関係ない
|スレッドまで止めなくても」と思うような気がするわけです。
Mutex#lock, unlock はキューの保護に実質 Thread.exclusive を使ってい
るので、あまり環境にやさしくない。ですから、 v = v + 100 の様にアトミッ
クに近い(がアトミックでない)命令に対しては exclusive{} を使うべきかと
思ったわけです。主眼が自分の保護にあって他への解放でない場合において。