在finalizer中请慎用Mutex[ruby-list:24697]
在finalizer所注册的块中, 若使用Mutex等进入等待状态的话, 就会发生死锁。具体的原因我还不太清除, 估计可能是因为: 当其他线程试图锁定Mutex时, 该锁内的GC会调用finalizer, 所以会发生死锁。为安全起见, 应该像weakref.rb那样来使用Thread.critical。
在下面的TCPServer实例中, 在Thread的块中的s2得到计算之前, 可能已经被while的循环所修改, 这将引发非预期的结果。 请您参考TCPServer的线程版的示例来了解正确的用法。
s = TCPServer.new(11111)
while(true)
s2 = s.accept
Thread.new do
sleep 0.1
p s2
end
end
timeout.rb
写在trap::timeout部分中的内容实际上归属于Thread的范畴。
赋值操作符并不是最小单元(atomic)[ruby-dev:22193]
在+=这样的赋值操作符的运作过程中, 线程有可能发生切换。因此若线程间共享变量的话, 就需要特别留意这个问题了。