From: hipster Date: 2000-04-28T11:02:49+02:00 Subject: [ruby-talk:02598] different thread semantics 1.4.3 -> 1.4.4 Hi fellow rubies, The following script produces different results when run under 1.4.3 and 1.4.4. It could be a problem in my script or a problem in ruby itself. The script runs N threads, all contending for the same mutex. Progress is shown graphically. the script: --------8<------- #!/usr/bin/ruby -w require "thread" N = 16 # number of threads $m = Mutex.new $state = "." * N def threadproc i 100.times do $m.synchronize do $state[i] = "o" print $state, $/ sleep rand(2)/100.0 # emulate some work $state[i] = "-" end end $state[i] = "x" end threads = [] for i in 0..N-1 do threads << Thread.start { threadproc i } sleep 0.1 end threads.each { |t| t.join } --------8<------- output under 1.4.3 (snipped and commented): --------8<------- # startup phase ---o............ --o-............ -o--............ o---............ ---o............ --o-............ -o--............ o---............ ---o............ --o-............ ----o........... --o--........... o----........... ---o-........... -o---........... ----o........... --o--........... o----........... ---o-........... -o---........... ----o........... --o--........... -----o.......... o-----.......... -----o.......... # middle phase -----o---------- ----o----------- ---o------------ --o------------- ---------------o --------------o- -------------o-- ------------o--- -----------o---- --------o------- -------o-------- -o-------------- o--------------- ----------o----- ---------o------ ------o--------- -----o---------- ----o----------- ---o------------ --o------------- ---------------o --------------o- -------------o-- ------------o--- # end phase xxxxxxxxx--o---- xxxxxxxxx-----o- xxxxxxxxx----o-- xxxxxxxxx-o----- xxxxxxxxxo------ xxxxxxxxx------o xxxxxxxxx---o--- xxxxxxxxxx-o---- xxxxxxxxxx----o- xxxxxxxxxx---o-- xxxxxxxxxx--o--- xxxxxxxxxx-----o xxxxxxxxxx--o--- xxxxxxxxxxo----- xxxxxxxxxx----o- xxxxxxxxxxx--o-- xxxxxxxxxxxo---- xxxxxxxxxxx----o xxxxxxxxxxx-o--- xxxxxxxxxxx----o xxxxxxxxxxx-xo-- xxxxxxxxxxxox--- xxxxxxxxxxx-x-o- xxxxxxxxxxxxx--o xxxxxxxxxxxxxo-- xxxxxxxxxxxxx--o xxxxxxxxxxxxxxo- --------8<------- output under 1.4.4: --------8<------- # startup o............... o............... o............... xo.............. xo.............. xo.............. xo.............. xo.............. xo.............. # middle xxx.xxxox...x.xx xxx.xxxox...x.xx xxx.xxxox...x.xx xxx.xxxox...x.xx xxx.xxxox...x.xx xxx.xxxox...x.xx xxx.xxxox...x.xx xxx.xxxox...x.xx xxx.xxxxx..ox.xx xxx.xxxxx..ox.xx xxx.xxxxx..ox.xx xxx.xxxxx..ox.xx xxx.xxxxx..ox.xx xxx.xxxxx..ox.xx # end xxxxxxxxxoxxxxxx xxxxxxxxxoxxxxxx xxxxxxxxxoxxxxxx xxxxxxxxxoxxxxxx xxxxxxxxxoxxxxxx xxxxxxxxxoxxxxxx xxxxxxxxxoxxxxxx xxxxxxxxxoxxxxxx xxxxxxxxxoxxxxxx xxxxxxxxxoxxxxxx xxxxxxxxxoxxxxxx xxxxxxxxxoxxxxxx --------8<------- As you can see, time-slicing has left the building. What is wrong? context (same for both runs): - linux 2.2.14 - egcs-1.1.2 (also tested with gcc 2.95.2; same results) - glibc 2.1.2 - pristine ruby sources 1.4.{3,4} Regards, Michel