来自API的信息非常稀少 - 还考虑到Thread.critical
似乎没有记录。
在Thread.critical中包含一个块,在从临界区退出时恢复原始值,并返回该块的值。
答案 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
。