前田です。

At Sun, 6 Jun 1999 01:38:08 +0900,
Shin-ichiro Hara <sinara / blade.nagaokaut.ac.jp> wrote:
> |というか、スレッドを使っている場合はなるべく並列度は下げたくない
> |ので、Mutexで十分な場合はMutexを使うだけですませる、という手法を
> |使うのではないでしょうか。
> 
> チュートリアルの件のコードでいえばループの回るスピードは
> Thread.exclusive の方が Mutex#synchronize に比べて3倍近く速いで
> す。(Linux で。当社比。^^;)ということは、exclusive{} は、その部
> 分だけではスケジュールを握っているけど、全体としては他のスレッド
> に動く時間と機会を多く与えているわけですよね。

うーん、Rubyのスレッドは時分割方式なので、IOがブロックしたりする
わけではない単純計算のプログラムでは、並列度(じゃなくて平行度か)
は低い方が速くなるんじゃないでしょうか。

あと、Mutexの(exclusiveに比べた)複雑性もスピードを落している一因
になっていると思います。

> |つまり、原さんは「わざわざ他のスレッドを動かし続けなくても」とい
> |う意識でいらっしゃるのだと思うのですが、普通は「わざわざ関係ない
> |スレッドまで止めなくても」と思うような気がするわけです。
> 
> Mutex#lock, unlock はキューの保護に実質 Thread.exclusive を使ってい
> るので、あまり環境にやさしくない。ですから、 v = v + 100 の様にアトミッ
> クに近い(がアトミックでない)命令に対しては exclusive{} を使うべきかと
> 思ったわけです。主眼が自分の保護にあって他への解放でない場合において。

それでもやはり関係ないスレッドまで止めるのは抵抗があるのですよ
ね...。
MutexをCで書いたら効率に関しては少しは改善できるかもしれないので
ちょっとトライしてみます。

-- 
前田 修吾