S
Suraj Kurapati
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?
Thanks for your consideration.
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?
Thanks for your consideration.