[#43120] [ruby-trunk - Bug #6124][Open] What is the purpose of "fake" gems in Ruby — Vit Ondruch <v.ondruch@...>

27 messages 2012/03/07

[#43142] Questions about thread performance (with benchmark included) — Rodrigo Rosenfeld Rosas <rr.rosas@...>

A while ago I've written an article entitled "How Nokogiri and JRuby

10 messages 2012/03/08

[#43148] [ruby-trunk - Feature #6126][Open] Introduce yes/no constants aliases for true/false — Egor Homakov <homakov@...>

16 messages 2012/03/09

[#43238] [ruby-trunk - Feature #6130][Open] inspect using to_s is pain — Thomas Sawyer <transfire@...>

21 messages 2012/03/11

[#43313] [ruby-trunk - Feature #6150][Open] add Enumerable#grep_v — Suraj Kurapati <sunaku@...>

17 messages 2012/03/15

[#43325] [ruby-trunk - Bug #6154][Open] Eliminate extending WaitReadable/Writable at runtime — Charles Nutter <headius@...>

25 messages 2012/03/16

[#43334] [ruby-trunk - Bug #6155][Open] Enumerable::Lazy#flat_map raises an exception when an element does not respond to #each — Dan Kubb <dan.kubb@...>

9 messages 2012/03/16

[#43370] [ruby-trunk - Feature #6166][Open] Enumerator::Lazy#pinch — Thomas Sawyer <transfire@...>

15 messages 2012/03/17

[#43373] [ruby-trunk - Bug #6168][Open] Segfault in OpenSSL bindings — Nguma Abojo <git.email.address@...>

14 messages 2012/03/17

[#43454] [ruby-trunk - Bug #6174][Open] Fix collision of ConditionVariable#wait timeout and #signal (+ other cosmetic changes) — "funny_falcon (Yura Sokolov)" <funny.falcon@...>

10 messages 2012/03/18

[#43497] [ruby-trunk - Bug #6179][Open] File::pos broken in Windows 1.9.3p125 — "jmthomas (Jason Thomas)" <jmthomas@...>

24 messages 2012/03/20

[#43502] [ruby-trunk - Feature #6180][Open] to_b for converting objects to a boolean value — "AaronLasseigne (Aaron Lasseigne)" <aaron.lasseigne@...>

17 messages 2012/03/20

[#43529] [ruby-trunk - Bug #6183][Open] Enumerator::Lazy performance issue — "gregolsen (Innokenty Mikhailov)" <anotheroneman@...>

36 messages 2012/03/21

[#43543] [ruby-trunk - Bug #6184][Open] [BUG] Segmentation fault ruby 1.9.3p165 (2012-03-18 revision 35078) [x86_64-darwin11.3.0] — "Gebor (Pierre-Henry Frohring)" <frohring.pierrehenry@...>

8 messages 2012/03/21

[#43672] [ruby-trunk - Feature #6201][Open] do_something then return :special_case (include "then" operator) — "rosenfeld (Rodrigo Rosenfeld Rosas)" <rr.rosas@...>

12 messages 2012/03/26

[#43678] [ruby-trunk - Bug #6203][Open] Array#values_at does not handle ranges with end index past the end of the array — "ferrous26 (Mark Rada)" <markrada26@...>

15 messages 2012/03/26

[#43794] [ruby-trunk - Feature #6216][Open] SystemStackError backtraces should not be reduced to one line — "postmodern (Hal Brodigan)" <postmodern.mod3@...>

15 messages 2012/03/28

[#43814] [ruby-trunk - Feature #6219][Open] Return value of Hash#store — "MartinBosslet (Martin Bosslet)" <Martin.Bosslet@...>

20 messages 2012/03/28

[#43858] [ruby-trunk - Feature #6222][Open] Use ++ to connect statements — "gcao (Guoliang Cao)" <gcao99@...>

12 messages 2012/03/29

[#43904] [ruby-trunk - Feature #6225][Open] Hash#+ — "trans (Thomas Sawyer)" <transfire@...>

36 messages 2012/03/29

[#43951] [ruby-trunk - Bug #6228][Open] [mingw] Errno::EBADF in ruby/test_io.rb on ruby_1_9_3 — "jonforums (Jon Forums)" <redmine@...>

28 messages 2012/03/30

[#43996] [ruby-trunk - Bug #6236][Open] WEBrick::HTTPServer swallows Exception — "regularfry (Alex Young)" <alex@...>

13 messages 2012/03/31

[ruby-core:43054] [ruby-trunk - Feature #3176][Closed] Thread#priority= should actually do something

From: Motohiro KOSAKI <kosaki.motohiro@...>
Date: 2012-03-02 14:36:37 UTC
List: ruby-core #43054
Issue #3176 has been updated by Motohiro KOSAKI.

Status changed from Assigned to Closed

1.9.3 has new thread scheduler and this problem is no longer reprodusable. closed then.

% ruby-193 thprio.rb 
77219459 3027217 0.9245522144742793 true

% ruby-193 thprio.rb 
78194222 2953676 0.9272026491678195 true

% ruby-193 thprio.rb 
78585760 1466848 0.9633528991335298 true

----------------------------------------
Feature #3176: Thread#priority= should actually do something
https://bugs.ruby-lang.org/issues/3176

Author: caleb clausen
Status: Closed
Priority: Normal
Assignee: Koichi Sasada
Category: core
Target version: 2.0.0


=begin
 Currently, Thread#priority= doesn't seem to do anything useful. See #1169 for more discussion of this. Here's a short program which demonstrates Thread#priority= not working, adapted from one in that issue:
 
 $ cat thrprio.rb 
 c1 = c2 = 0
 go=nil
 t2 = Thread.new { 1 until go; loop { c2 += 1 } }
 t2.priority = -2
 t1 = Thread.new { 1 until go; loop { c1 += 1 } }
 t1.priority = -1
 go=true
 sleep 5
 t1.kill
 t2.kill
 puts "#{c1} #{c2} #{(c1-c2).to_f/(c1+c2)} #{c1 > c2}"
 
 $ ruby thrprio.rb 
 17102855 17276166 -0.005041184855147562 false
 $ ruby thrprio.rb 
 16839456 16977800 -0.0040909291989864585 false
 $ ruby thrprio.rb 
 17063114 17248978 -0.0054168658675781125 false
 $ ruby thrprio.rb 
 16809137 17019727 -0.006225157309450296 false
 
 When I run it, the 2 counts have very nearly the same value... to within <1%. I see c1 < c2 almost always. Occasionally, I see c2 > c2. If thread priorities are working, c1 should be much larger than c2. (In ruby 1.8, in which Thread#priority= works, c1 is several orders of magnitude larger than c2.) 
 
 Depending on your OS and what order the threads are started in, you may see the reverse situation, where c1 > c2, but occasionally c1 < c2. This is still wrong, tho. The difference between c1 and c2 should be very large.
 
 In the discussion below, GIL means the global interpreter lock (global_vm_lock).
 
 Also, keep in mind that every mutex has inside it somewhere a queue which holds a list of the threads waiting for the mutex.
 
 I have a theory that there's an interaction between the scheduler and the GIL which causes priorities to be effectively ignored. Imagine this:
 
 There are 2 threads running, A and B. A.priority > B.priority.
 Initially, A runs (so it holds GIL).
 B tries to run, but has to wait on GIL. 
 After a short time, the scheduler forces a context switch.
 So now A unlocks GIL, planning to immediately lock it again. This yields time to other threads.
 But before A can lock GIL, B is scheduled (since it was at the head of the queue waiting for the GIL). 
 Now B owns GIL.
 A tries to lock GIL, but can't obtain it, so it waits for it to be available.
 After another timeslice, B yields time back to A in the same way.
 ...and so on
 
 So, A and B are effectively alternating timeslices, and each gets roughly equal amounts of time. Even tho A should have a higher priority, and should get much more time. If the OS uses priority queues rather than normal fifo queues for the internal queue inside a mutex, then there would be no problem. However, I strongly suspect that most operating systems use fifo queues within their mutex implementations.
 
 So far, this is a theory. I have no certain proof. I have poked around in the pthreads implementation inside glibc, and concluded that mutexes in glibc do seem to use fifo queues (not priority queues) internally.
 
 I had assumed that thread_timer() in thread_pthread.c is what causes thread switches to happen... however, as I look at it more closely, I now suspect that that is not the case. I don't know where context switches are going on... but I still think the overall theory is correct.
 
 If I'm right, then this might be fixable by making timeslices variable length, instead of always 10 ms. Lower priority threads would get shorter timeslices. Alternatively, high priority threads could get several timeslices in a row, and lower priority threads only one. There may well be even better ways to address the problem.
 
 Yusuke, I've tried to make my explanation as clear as possible. Please let me know if it's still hard to understand.
=end



-- 
http://bugs.ruby-lang.org/

In This Thread

Prev Next