[#1215] Tk widget demo; English Tk docs?; Java 1.2 Swing — "Conrad Schneiker" <schneiker@...>
Hi,
[#1218] Trivial FAQ bug — Dave Thomas <Dave@...>
[#1229] A vote for old behavior — Dave Thomas <Dave@...>
[#1232] Any FAQ requests, updates, ... — Dave Thomas <Dave@...>
[#1233] Singleton classes — Dave Thomas <Dave@...>
[#1263] Draft of the updated Ruby FAQ — Dave Thomas <Dave@...>
[#1307] Ruby/GTK 0.23 released — Hiroshi IGARASHI <igarashi@...>
Hi all,
From: Hiroshi IGARASHI <igarashi@ueda.info.waseda.ac.jp>
From: "Conrad Schneiker" <schneiker@jump.net>
On Fri, Feb 18, 2000 at 09:37:27PM -0500, Yasushi Shoji wrote:
[#1322] FAQ: Ruby acronyms — "Conrad Schneiker" <schneiker@...>
In the spirit of TABWTDI (there are better ways to do it), I'd like to
[#1341] Vim syntax file — Mirko Nasato <mirko.nasato@...>
Hi,
On Mon, Feb 14, 2000 at 05:44:39PM +0100, Mirko Nasato wrote:
[#1354] Say hi (bis) — Pixel <pixel_@...>
hi all,
[#1355] nice sample for functional stuff — Pixel <pixel_@...>
what about having map in standard (and map_index too)?
[#1373] Ruby Language Reference Manual--Glossary — "Conrad Schneiker" <schneiker@...>
I was going to print the Ruby Language Reference Manual when I noticed that
[#1376] Re: Scripting versus programming — Andrew Hunt <andy@...>
Conrad writes:
[#1379] Re: Yield — Andrew Hunt <andy@...>
>From: "Conrad Schneiker" <schneiker@jump.net>
[#1384] Re: Say Hi — mengx@...
My suggestion was to try to find a more comfortable method name (to me, and
[#1392] Re: Some Questions - Parameterised Types / Invariants — Andrew Hunt <andy@...>
>1. Parameterised Types / Template Classes
[#1398] Bignum aset — Andrew Hunt <Andy@...>
[#1488] Discussion happens on news.groups — Clemens Hintze <c.hintze@...>
Hi,
[#1508] Ruby/GTK and the mainloop — Ian Main <imain@...>
Hello Ian,
On Wed, Feb 23, 2000 at 02:56:10AM -0500, Yasushi Shoji wrote:
[#1516] Ruby: PLEASE use comp.lang.misc for all Ruby programming/technical questions/discussions!!!! — "Conrad Schneiker" <schneiker@...>
((FYI: This was sent to the Ruby mail list.))
From: "Conrad Schneiker" <schneiker@jump.net>
[#1528] ruby <=> python — Quinn Dunkan <quinn@...>
Hello! I'm new to ruby-talk, and mostly new to ruby. I'm making a document
[#1551] Ruby thread scheduling buglet — Ian Main <imain@...>
[#1569] Re: Ruby: constructors, new and initialise — Yukihiro Matsumoto <matz@...>
The following message is a courtesy copy of an article
[#1591] Certain char's not recognized by "." in regex? — Wes Nakamura <wknaka@...>
[#1592] Race condition in Singleton — Dave Thomas <Dave@...>
[ruby-talk:01551] Ruby thread scheduling buglet
You're going to like this one :)
The following program:
----
require "thread"
N=4
def sitter(n)
a = 0
while TRUE
if (a.remainder (5000) == 0)
printf ("thread %d at %d\n", n, a)
end
a += 1
end
end
def sleeper
while TRUE
sleep (0.01)
end
end
for i in 0..N-1
Thread.start{sitter(i)}
end
Thread.start{sleeper}
sleep
-----
unexpectedly produces:
thread 0 at 0
thread 0 at 5000
thread 0 at 10000
thread 1 at 0
thread 1 at 5000
thread 1 at 10000
thread 0 at 15000
thread 2 at 0
thread 2 at 5000
thread 2 at 10000
thread 1 at 15000
thread 1 at 20000
thread 0 at 20000
thread 0 at 25000
thread 0 at 30000
thread 3 at 0
thread 3 at 5000
thread 3 at 10000
thread 2 at 15000
thread 2 at 20000
thread 1 at 25000
thread 1 at 30000
thread 0 at 35000
thread 0 at 40000
thread 3 at 15000
thread 3 at 20000
thread 3 at 25000
thread 3 at 30000
thread 3 at 35000
thread 3 at 40000
...
(continuing on thread 3 for the rest of the programs life)
I noticed this because the sleep () call is essentially what the gtk
bindings are using, and you can't run more than one extra thread for them
either.
I think the reason is in rb_thread_schedule ():
...
if (num_waiting_on_timer > 0) {
now = timeofday();
FOREACH_THREAD_FROM(curr, th) {
if (th->wait_for & WAIT_TIME) {
if (th->delay <= now) {
th->delay = 0.0;
th->wait_for &= ~WAIT_TIME;
th->status = THREAD_RUNNABLE;
num_waiting_on_timer--;
next = th;
} else if (th->delay < delay) {
delay = th->delay;
}
}
}
END_FOREACH_FROM(curr, th);
}
...
with the constant calling to sleep, it goes through this every call to
rb_thread_schedule (). The thread that was sleeping, wakes up probably just
about every run through this function, so its set as the current thread. It
then loops about, goes to sleep again, and somewhere in there the next
thread is run (thread 3 in our example), but then this one wakes up again
before any others have a chance to run, and the scheduling is reset.
I dunno what the perfect ruby-ish solution is so I'll leave that to you folk.
Ian