Thread.exclusive实际上做了什么?

时间:2014-03-28 21:37:36

标签: ruby multithreading

来自API的信息非常稀少 - 还考虑到Thread.critical似乎没有记录。

  

在Thread.critical中包含一个块,在从临界区退出时恢复原始值,并返回该块的值。

1 个答案:

答案 0 :(得分:5)

tl; dr:它使给定的块执行,因此没有其他ruby线程可以中断它。

documentation of Thread.exclusive具有误导性,因为它提到Thread.critical= which was removed in ruby version 1.9。但是,我们可以通过查看ruby源代码来推断它的作用。

MRI Thread.exclusive中定义prelude.rb。由于它是一个非常短的文件,我将引用它的内容:

class Thread
  MUTEX_FOR_THREAD_EXCLUSIVE = Mutex.new # :nodoc:

  def self.exclusive
    MUTEX_FOR_THREAD_EXCLUSIVE.synchronize{
      yield
    }
  end
end

此处Thread类由静态常量MUTEX_FOR_THREAD_EXCLUSIVE扩展,其中包含Mutex。调用exclusive时,我们会要求互斥锁执行synchronize块。

Mutex' documentation中所述,synchronize获取锁定,运行块,并在块完成时释放锁定。

因为互斥锁是线程全局状态,所以只有一个Thread可以同时保存它。

这样可行:

# no other Thread can do something between this puts statements
Thread.exclusive do
  puts 1
  puts 2
end

但这不会:

Thread.exclusive do
  puts 1
  Thread.exclusive do
    puts 2
  end  
  puts 3
end

因为此错误:ThreadError: deadlock; recursive locking