From: "David A. Black" Date: 2010-06-16T21:20:19+09:00 Subject: Re: threads & mutex question (Rubyist book example) Hi -- On Sun, 6 Jun 2010, Suraj Kurapati wrote: > Hi, > > I am concerned about the lack of mutual exlusion in code listing > 14.2 "Chat server using TCPServer and threads" on page 430 in "The > Well-Grounded Rubyist" book. That code goes something like this: > > chatters = [] > > while ... > Thread.new(...) do |c| > chatters.each { ... } > chatters.push c > chatters.each { ... } > chatters.delete c > chatters.each { ... } > end > end > > Multiple threads are spawned and each of them accesses the shared > resource (the chatters array) directly without mutual exclusion. > > What happens when a thread inside chatters.each() gets descheduled > and another thread proceeds to add or delete an object to chatters? > > Shouldn't there be a Mutex#synchronize call wrapping all access to > the chatters array? Probably. You're right that the code as it stands runs the risk of modifying an array while iterating over it -- which, though it probably wouldn't do any serious damage in this case, is (I think) undefined as to its results in Ruby, and in any case is something I don't (consciously :-) advocate doing. David -- David A. Black, Senior Developer, Cyrus Innovation Inc. THE Ruby training with Black/Brown/McAnally COMPLEAT Coming to Chicago area, June 18-19, 2010! RUBYIST http://www.compleatrubyist.com