我做了一个快速的谷歌搜索,几乎所有关于 Ruby 原子性的内容都建议在操作周围包装一个 Mutex。但是,我怀疑这种方法不满足原子性的通常定义,因为信号可能会中断同步代码。例如(取自Ruby Best Practices):
lock = Mutex.new
# XXX this is an example of what NOT to do inside a signal handler:
trap(:USR1) do
lock.synchronize do
# if a second SIGUSR1 arrives here, this block of code
# will fire again. Attempting Mutex#synchronize twice
# the same thread leads to a deadlock error
end
end
我知道原子性对于高级语言来说不太重要,但是为了研究,我想在这个问题上得到一个规范的答案,用于使用 GIL(例如MRI 2.0.0)和没有例如 JRuby 1.7.4 和 Rubinius的实现1.2.4