[ruby-talk:02598] different thread semantics 1.4.3 -> 1.4.4

From: hipster <hipster@...4all.nl>
Date: 2000-04-28 09:02:49 UTC
List: ruby-talk #2598
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

In This Thread

Prev Next