[#14715] HTTP Client with Ruby — TAKAHASHI Masayoshi <maki@...>
高橋征義です。
なひです.
高橋征義です。
ごとけんです
なひです.
高橋です。みなさまどうもありがとうございます。
なひです.
前橋です。
なひです.
なひです.すいません,駄目です.^^;
[#14747] Ruby-gtk の Text Widget について — Takano Naoki <takanon@...>
はじめまして。
[#14763] do end + do end — Wakou Aoyama <wakou@...>
青山です。
[#14765] ruby 1.3.4 with ipv6 — Yasunari Momoi <momo@...>
ruby 1.3.4 を入れたんですが,IPv6 対応しているんですね (^^).
[#14766] ruby 1.3.4 on BSD/OS 3.1 — Yasunari Momoi <momo@...>
BSD/OS 3.1 (with kame) で ruby-1.3.4 を作ろうとしているんで
まつもと ゆきひろです
前田です。
わたなべです.
[#14790] Microsoft Perl ? — ARIMA Yasuhiro <fit0298@...>
有馬です。
[#14833] Regacy scripts depend the ruby old version. — ARIMA Yasuhiro <fit0298@...>
有馬です。
[#14842] texinfo document for ruby-1.3 — Koji Arai <JCA02266@...>
新井です。
まつもと ゆきひろです
新井です。
From: Koji Arai <JCA02266@nifty.ne.jp>
[#14854] Rubyfaq-990607 — Akira Endo <akendo@...3.rim.or.jp>
遠藤です.
[#14860] CVSup server — Yasuhiro Fukuma <yasuf@...>
福間%未読メールどっさり@福岡 です。
[#14863] OO Software Construction by Meyer — Akira Endo <akendo@...3.rim.or.jp>
遠藤です.
[#14874] ruby-gtk trouble — Jun Adachi <adachi@...>
安達@沖データと申します。
[#14900] Rubyfaq-990608 — Akira Endo <akendo@...3.rim.or.jp>
遠藤です.
[#14917] Ruby/Tk and Threads — Tomoyuki Kosimizu <greentea@...2.so-net.ne.jp>
こんにちは、越水です。
[#14953] 男親なら誰でも思う — 中村暁史 <anakamur@...>
[#14957] textarea with CGI.rb — HATTORI Masashi <hattori@...>
服部といいます。こんにちは。
[#14970] thread with curses — HATTORI Masashi <hattori@...>
服部といいます。こんにちは。
[#14980] 初期化メソッドの追加 — ARIMA Yasuhiro <fit0298@...>
有馬です。
[#15003] 文字列から数値への変換失敗を検出したい — ARIMA Yasuhiro <fit0298@...>
有馬です。
[#15012] ext ML の過去ログはいずこ? — 中村暁史 <anakamur@...>
原です。
akaishi です。
わたなべです.
前田です。
[#15045] mail library — Minero Aoki <aamine@...>
あおきです。
あおきです。
あおきです。
まつもと ゆきひろです
わたなべです.
まつもと ゆきひろです
石橋秀仁です.
あおきです。
まつもと ゆきひろです
あおきです。
なひです.
あおきです。
なひです.
松尾です。
なひです.
松尾です。
有馬@FITECです。
松尾です。
はじめまして、岩間です。
なひです.mod_rubyと格闘中です.
なひです.mod_rubyネタはruby-listでよいでしょうか?
前田です。
なひです.
前田です。
なひです.
小松です。
前田です。
小松です。
前田です。
小松です。
前田です。
小松です。
まつもと ゆきひろです
たむら です。
あおきです。
まつもと ゆきひろです
あおきです。
まつもと ゆきひろです
あおきです。
[#15057] 複雑?な構造体の定義方法 — Koichi Shigematsu <shige@...>
しげまつ と申します。 とっても久しぶりの投稿です。
まつもと ゆきひろです
しげまつ です。
まつもと ゆきひろです
ごとけんです
まつもと ゆきひろです
ごとけんです
まつもと ゆきひろです
In message "[ruby-list:15078] Re: pattern (Re: 複雑?な構造体の定義方法)"
[#15093] String#rindex with arbitrary starting point — kjana@... (YANAGAWA Kazuhisa)
「String#rindex の第二引数ってば,探索を『始める』ポイントじゃなくて
前田です。
[#15112] pty on NeXTSTEP3.3J — SHIROYAMA Takayuki <psi@...>
[#15116] irb & ruby — Takashi Nishimoto <g96p0935@...>
ruby の最新版 (990625) を /usr/local 以下にインストールしたのですが、
[#15121] ruby-gtk-0.19 released — Hiroshi Igarashi <igarashi@...>
いがらし%Ruby/GTKメンテナ です。
From: Hiroshi Igarashi <igarashi@ueda.info.waseda.ac.jp>
いがらしです。
[#15131] game of life: ruby/gtk version — Takahiro Maebashi <maebashi@...>
前橋です。
[#15160] undefined method `-@' for Fixnum (NameError) — Tomoyuki Kosimizu <greentea@...2.so-net.ne.jp>
こんにちは、越水です。
まつもと ゆきひろです
[ruby-list:15030] ConditionVariable (cv3.rb)
原です。
三たび Condition Variable についてです。
In message "[ruby-list:14847] Re: ConditionVariable (again)"
on 99/06/07, Shugo Maeda <shugo@netlab.co.jp> writes:
|前田です。
|防ぐ手はある(フラグを一個追加すればいいのかな)と思うのですが、そ
cv2.rb に手を加えて、別の方法でこれをやってみました。
-------------^ cv3.rb
class Mutex
attr_writer :signal
def initialize
@waiting = [[], []]
def @waiting.push0(x); self[0].push(x); end
def @waiting.push(x); self[1].push(x); end
def @waiting.shift; self[0].shift || self[1].shift; end
@locked = nil
@signal = nil
end
def locked?
@locked
end
def try_lock
result = false
Thread.critical = true
unless @locked || @signal && @signal != Thread.current
@signal = nil
if iterator?
yield
else
@locked = true
end
result = true
end
Thread.critical = false
result
end
def lock(n = nil)
Thread.critical = true
while @locked || @signal && @signal != Thread.current
if n
@waiting.push0 Thread.current
else
@waiting.push Thread.current
end
Thread.stop
Thread.critical = true
end
@signal = nil
if iterator?
yield
else
@locked = true
end
Thread.critical = false
self
end
def unlock
return unless @locked
Thread.critical = true
t = @waiting.shift
if iterator?
yield
else
@locked = nil
end
Thread.critical = false
t.run if t
self
end
def synchronize
return yield if @locked == Thread.current
begin
owner = nil
lock do
owner = @locked
@locked = Thread.current
end
yield
ensure
unlock do
@locked = owner
end
end
end
def wait
owner = nil
if @locked
Thread.critical = true
t = @waiting.shift
t.wakeup if t
owner = @locked
@locked = nil
yield
Thread.stop
end
lock(0) do
@locked = owner
end
end
end
class ConditionVariable
def initialize
@waiters = []
end
def wait(mutex)
mutex.wait do
@waiters.push(Thread.current)
end
end
def signal(mutex = nil)
if t = @waiters.shift
if mutex
mutex.signal = t
t.wakeup
else
t.run
end
end
end
def broadcast
Thread.critical = true
waiters0 = @waiters.dup
@waiters.clear
Thread.critical = false
for t in waiters0
t.wakeup
end
end
end
-------------$ cv3.rb
これを走らせてみます。テストプログラムは [ruby-list:14819] の
test1.rb を改造した test-cv.rb(後掲)で、バッファサイズ3のパ
イプに、送り手4スレッド受け手3スレッドでオブジェクトを通すも
のです。停止するのは全ての受け手スレッドが 1000 個のオブジェク
トを受け取った時とします。
結果は
blade$ time ./test-cv.rb cv3
TEST CONDITION VARIABLE <<< CV3 >>>
Sender:4, Receiver:3 (each receives 1000 times), Buffer:3
Idling1: send = 0, receive = 0
Idling2: send = 0, receive = 0
#1 sends 656 times
#2 sends 637 times
#3 sends 994 times
#4 sends 716 times
real 0m7.074s
user 0m6.780s
sys 0m0.010s
Idling1 は送出(send)、受入(receive)において無駄な wait 動作に
何回「入った」かを表し、Idling2 は無駄に wait ループをトータル
で何回「回した」かを表しています。
その下は各スレッドが幾つオブジェクトを送出したかを表しています。
(#3 が大きいのは謎。)
cv3.rb の構造ですが、シグナルに宛先をつけて送り、他のスレッド
はシグナルが自分向けでなければ Mutex がロックされてなくてもブ
ロックさせます。従って Mutex にシグナルの宛先であるスレッドを
覚えておくインスタンス変数 @signal が必要になっています。
また、ConditionVariable#signal() に mutex を渡さなければ一般的
な CV として動く様にしました。
cv3 では Idling1/2 が 0 です。これは signal の後、他のスレッド
に変数を操作されることなく、確実に wait に処理が回るので、wait
において while などで条件の再チェックが実は不必要である事を示し
ています(if で調べれば十分という事)。ある意味で究極の CV ??
monitor.rb を参考にせず、独立に書いていたのですが、結局どん
どん monitor.rb に似て来て最終的に、、、酷似している。(^^;
結局誰が書いても似た感じになるのかな。
参考までに cv2.rb と monitor.rb と mutex.c ([ruby-list:14849])
での結果です。
blade$ time ./test-cv.rb cv2
TEST CONDITION VARIABLE <<< CV2 >>>
Sender:4, Receiver:3 (each receives 1000 times), Buffer:3
Idling1: send =84, receive =10
Idling2: send =945, receive =10
#1 sends 80 times
#2 sends 803 times
#3 sends 935 times
#4 sends 1185 times
real 0m8.963s
user 0m8.790s
sys 0m0.000s
blade$ time ./test-cv.rb monitor
TEST CONDITION VARIABLE <<< MONITOR >>>
Sender:4, Receiver:3 (each receives 1000 times), Buffer:3
Idling1: send =35, receive = 0
Idling2: send =35, receive = 0
#1 sends 1263 times
#2 sends 624 times
#3 sends 483 times
#4 sends 632 times
real 0m11.545s
user 0m11.380s
sys 0m0.020s
blade$ time ./test-cv.rb mutex
TEST CONDITION VARIABLE <<< MUTEX >>>
Sender:4, Receiver:3 (each receives 1000 times), Buffer:3
Idling1: send = 9, receive = 0
Idling2: send = 9, receive = 0
#1 sends 676 times
#2 sends 675 times
#3 sends 952 times
#4 sends 700 times
real 0m5.479s
user 0m5.200s
sys 0m0.010s
何で一般的には Conditional Variable は、cv3.rb の様な仕様
になっていないんでしょうね。Mutex の拡張が必要だからか効率
が悪くなりそうだからか複雑だからか、、。