[#3567] Nil is a subclass of Object? — shugo@... (maeda shugo)

前田です。

26 messages 1997/08/02
[#3570] Re: Nil is a subclass of Object? — matz@... (Yukihiro Matsumoto) 1997/08/03

まつもと ゆきひろです

[#3572] Re: Nil is a subclass of Object? — keiju@... (石塚圭樹 ) 1997/08/03

けいじゅ@日本ラショナルです.

[#3573] Re: Nil is a subclass of Object? — matz@... (Yukihiro Matsumoto) 1997/08/03

まつもと ゆきひろです

[#3715] may i make a ruby.rpm? — Shoichi OZAWA <ozawa@...>

こんにちは 小澤@日立 です。

15 messages 1997/08/20

[#3736] module for GNU Readline Library — shugo@... (前田 修吾 / maeda shugo)

前田です。

12 messages 1997/08/20

[#3833] [Bug] Regexp.quote — shugo@... (前田 修吾 / maeda shugo)

前田です。

25 messages 1997/08/26
[#3836] BEGIN and END — Masaki Suketa <suke@...> 1997/08/26

助田です。

[#3837] Re: BEGIN and END — matz@... (Yukihiro Matsumoto) 1997/08/27

まつもと ゆきひろです

[#3842] Re: BEGIN and END — keiju@... (石塚圭樹 ) 1997/08/27

けいじゅ@日本ラショナルです.

[#3839] Re: SyslogSendmail class — takagi@... (TAKAGI Hiromitsu)

> そうですね.本当はこーゆーのが ruby-list の本来の形ですね.

18 messages 1997/08/27
[#3840] Re: SyslogSendmail class — matz@... (Yukihiro Matsumoto) 1997/08/27

まつもと ゆきひろです

[#3852] Re: SyslogSendmail class — keiju@... (石塚圭樹 ) 1997/08/27

けいじゅ@日本ラショナルソフトウェアです.

[#3909] Object#id <=> Fixnum#id2object ? (Re: SyslogSendmail class) — shugo@... (前田 修吾 / maeda shugo) 1997/08/28

前田です。

[#3869] Re: SyslogSendmail class — takagi@... (TAKAGI Hiromitsu)

> Moduleのところに書いてあるんですねえ.こういうノウハウを記述

15 messages 1997/08/27
[#3870] Re: SyslogSendmail class — matz@... (Yukihiro Matsumoto) 1997/08/27

まつもと ゆきひろです

[#3906] document for beginner — toyofuku@...

豊福@パパイヤです。

21 messages 1997/08/28
[#3917] Re: document for beginner — Kikutani Makoto <kikutani@...> 1997/08/29

きくたにです。

[#3925] Re: document for beginner — Masaki Suketa <suke@...> 1997/08/29

助田です

[#3926] Curses (Re: document for beginner) — Kikutani Makoto <kikutani@...> 1997/08/29

Fri, Aug 29, 1997 at 12:54:15PM +0900 において

[#3933] Re: ruby constants — toyofuku@...

豊福@パパイヤです。

16 messages 1997/08/29
[#3934] Re: ruby constants — matz@... (Yukihiro Matsumoto) 1997/08/29

まつもと ゆきひろです

[#3939] Re: ruby constants — WATANABE Hirofumi <watanabe@...> 1997/08/29

わたなべです.

[ruby-list:3655] Re: [Q] How to use Synchronizer?

From: keiju@... (石塚圭樹 )
Date: 1997-08-11 04:35:45 UTC
List: ruby-list #3655
けいじゅ@いそうろう.日本ラショナルです.

In [ruby-list :03649 ] the message: "[ruby-list:3649] [Q] How to use
Synchronizer? ", on Aug/10 21:31(JST) shugo@po.aianet.ne.jp (maeda
shugo) writes:

>前田です。
>
>Mutexを使うと
>
>$m = Mutex.new
>def foo
>   $m.synchronize do
>      print "foo\n"
>   end
>end
>3.times do
>   $m.synchronize do
>      foo
>   end
>end
>
>のようなのがうまく動きませんよね?

ですね.

>Mutexの代りにSynchronizerを使ってみたらうまくいったのですが、
>Synchronizerではこういった場合の動作も保証されているのでしょうか?

保証されています. ただし, カウントを数えているのでlockの数だけunlockを
行わないとlockが解除されません.

>それと、modeの指定の意味がわからないのですが、どうやって使うもの
>なのでしょう?

そうですね. 説明って全然ないですよね...

Syncronizerは(カウント付)2-phase lockを採用しています. 

mode:
  :UN    ロックの解除
  :SH    共有ロック
  :EX    排他ロック

:EXがMutexのロックと同じモードです. このロックがかかっている時に, 他の
スレッドがロックしようとするとブロックされます. 排他ロックはwrite lock
ともいいます. 書き込み中に他のクライアント(スレッド)が読み/書きすると
危険ですよね.

:SHは共有ロックでflockのLOCK_SHと同じものだと思います. このロックがか
かっている時は, 以下の動作をします:

* 他のスレッドが共有ロックを行おうことはできる.
* 他のスレッドが排他ロックを行おうとすると, ブロックされる.

共有ロックは read lock とも呼ばれます. 読み込みの場合, 同時に複数のク
ライアント(スレッド)が読み込んでも安全ですが, 書き込みが行われると不整
合が発生する可能性があるのでwrite はblockされるようになっています.

普通の2-phase lockと違うところは, countがついているところなのですが:

カウントはどうなっているかというと, カウントは2種類あって
read-lock-countとwrite-lock-count があります. 動作はどうなっているかと
いうと以下の例を見て下さい::

R:  共有ロック(read-lock)
W:  排他ロック(write-lock)
Rn: 共有ロックカウント
Wn: 排他ロックカウント

case 1:
ロックの種類:R         R         R         UL        UL        UL
カウントの数:->(R1, W0)->(R2, W0)->(R3, W0)->(R2, W0)->(R1, W0)->(R0, W0)

という感じでロックを行うとカウントが増えて, アンロックするとカウントが
減ります.

case 2:
ロックの種類:W         W         W         UL        UL        UL
カウントの数:->(R0, W1)->(R0, W2)->(R0, W3)->(R0, W2)->(R0, W1)->(R0, W0)

排他ロックの場合も同じです. 問題なのが共有ロックと排他ロックが混在した
時です:

case 3:
ロックの種類: R       -> R      -> W      -> UL     -> UL     -> UL
カウントの数: (R1, W0)->(R2, W0)->(R2, W1)->(R2, W0)->(R1, W0)->(R0, W0)

write lockが行われた時点で, lockのモードが排他ロックにアップグレードさ
れます.

unlockは, ロックをかけた順番の逆順に解除されます. この場合, 1度めの
unlockで排他lockが解除され, 残り2回unlockを行うと共有ロックが解除され
ます.

あくまでも, ロックをかけた逆順番にロックが解除されるので, 注意が必要で
す. Synchronizer#syncを使っている限り問題はないと思いますが...

case 4:
ロックの種類: R       -> W      -> R      -> UL     -> UL     -> UL
カウントの数: (R1, W0)->(R1, W1)->(R1, W2)->(R1, W1)->(R1, W0)->(R0, W0)

排他ロックの後にかけたロックは, 常に排他ロックとなります.

この場合, 2度めのunlockで排他ロックが解除され, 3度めのunlockで共有ロッ
クが解除されます.

PS.
現在, Synchronizerをversion up中です. Mutex_mのような機能をつけようと
しています.

あと, case 3の注意事項がちょっと気になるので, unlockにモードもつけられ
るようにしたいと思います.

__
..........................................石塚 圭樹@日本ラショナル...
----------------------------------->> e-mail: keiju@bc.mbn.or.jp <<---

In This Thread