With the discussion surrounding merb/rails and thread safety, I've been
somewhat concerned with making my own tiny home-rolled web apps that I
write thread safe, if only to become more knowledgeable on the subject.
I know it's probably hard to generalize, but does anybody have any
simple rules to follow (or resources to share) for writing thread safe
code?
Rule #1: Don't use global variables.
Rule #2: If you do, when you change them, wrap them in a blocking mechanism such as a mutex or critical section so two threads can't try at once.
Rule #3: If you are changing the state of an object that is not thread-local, wrap the change in a mutex (etc.)
So, for example:
require 'thread'
my_object_sync = Mutex.new
Thread.new do
# just lock on this object
my_object_sync.synchronize do
# Update that is not atomic
end
end
Rule #4: Don't be too sure that any operation in Ruby is atomic.
···
On Feb 15, 2008, at 10:54 AM, Jeff Turc wrote:
With the discussion surrounding merb/rails and thread safety, I've been
somewhat concerned with making my own tiny home-rolled web apps that I
write thread safe, if only to become more knowledgeable on the subject.
I know it's probably hard to generalize, but does anybody have any
simple rules to follow (or resources to share) for writing thread safe
code?
I know it's probably hard to generalize, but does anybody have any
simple rules to follow (or resources to share) for writing thread safe
code?
Rule #3: If you are changing the state of an object that is not thread- local, wrap the change in a mutex (etc.)
Corollary: use thread confinement, i.e. design your app in a way that most objects are used in a single thread at a time only. Restrict need for synchronization to the minimum needed.
Rule #4: Don't be too sure that any operation in Ruby is atomic.
Somehow this reminds me of "Blondie" and "Atomic". Those were the days...