非常教程

Ruby 2.4参考手册

同步 | Sync

Sync_m

用计数器提供两相锁定的模块。

常量

EX SH UN

锁定模式

属性

sync_ex_countRW

sync_ex_lockerRW

sync_modeRW

sync_sh_lockerRW

sync_upgrade_waitingRW

sync_waitingRW

公共类方法

append_features(cl) 显示源

调用超类方法

# File lib/sync.rb, line 89
def Sync_m.append_features(cl)
  super
  # do nothing for Modules
  # make aliases for Classes.
  define_aliases(cl) unless cl.instance_of?(Module)
  self
end

define_aliases(cl) 显示源

# File lib/sync.rb, line 77
def Sync_m.define_aliases(cl)
  cl.module_eval %q{
    alias locked? sync_locked?
    alias shared? sync_shared?
    alias exclusive? sync_exclusive?
    alias lock sync_lock
    alias unlock sync_unlock
    alias try_lock sync_try_lock
    alias synchronize sync_synchronize
  }
end

extend_object(obj) 显示源

调用超类方法

# File lib/sync.rb, line 97
def Sync_m.extend_object(obj)
  super
  obj.sync_extend
end

new(*args)显示源

调用超类方法

# File lib/sync.rb, line 266
def initialize(*args)
  super
  sync_initialize
end

公共实例方法

sync_exclusive?() 显示源

# File lib/sync.rb, line 124
def sync_exclusive?
  sync_mode == EX
end

sync_extend() 显示源

# File lib/sync.rb, line 102
def sync_extend
  unless (defined? locked? and
          defined? shared? and
          defined? exclusive? and
          defined? lock and
          defined? unlock and
          defined? try_lock and
          defined? synchronize)
    Sync_m.define_aliases(singleton_class)
  end
  sync_initialize
end

sync_inspect() 显示源

# File lib/sync.rb, line 248
def sync_inspect
  sync_iv = instance_variables.select{|iv| /^@sync_/ =~ iv.id2name}.collect{|iv| iv.id2name + '=' + instance_eval(iv.id2name).inspect}.join(",")
  print "<#{self.class}.extend Sync_m: #{inspect}, <Sync_m: #{sync_iv}>"
end

sync_lock(m = EX) 显示源

# File lib/sync.rb, line 136
def sync_lock(m = EX)
  return unlock if m == UN
  Thread.handle_interrupt(StandardError => :on_blocking) do
    while true
      @sync_mutex.synchronize do
        begin
          if sync_try_lock_sub(m)
            return self
          else
            if sync_sh_locker[Thread.current]
              sync_upgrade_waiting.push [Thread.current, sync_sh_locker[Thread.current]]
              sync_sh_locker.delete(Thread.current)
            else
              unless sync_waiting.include?(Thread.current) || sync_upgrade_waiting.reverse_each.any?{|w| w.first == Thread.current }
                sync_waiting.push Thread.current
              end
            end
            @sync_mutex.sleep
          end
        ensure
          sync_waiting.delete(Thread.current)
        end
      end
    end
  end
  self
end

sync_locked?() 显示源

访问

# File lib/sync.rb, line 116
def sync_locked?
  sync_mode != UN
end

sync_shared?() 显示源

# File lib/sync.rb, line 120
def sync_shared?
  sync_mode == SH
end

sync_synchronize(mode = EX) { || ... }显示源

# File lib/sync.rb, line 229
def sync_synchronize(mode = EX)
  Thread.handle_interrupt(StandardError => :on_blocking) do
    sync_lock(mode)
    begin
      yield
    ensure
      sync_unlock
    end
  end
end

sync_try_lock(mode = EX) 显示源

锁定方法。

# File lib/sync.rb, line 129
def sync_try_lock(mode = EX)
  return unlock if mode == UN
  @sync_mutex.synchronize do
    sync_try_lock_sub(mode)
  end
end

sync_unlock(m = EX) 显示源

# File lib/sync.rb, line 164
def sync_unlock(m = EX)
  wakeup_threads = []
  @sync_mutex.synchronize do
    if sync_mode == UN
      Err::UnknownLocker.Fail(Thread.current)
    end

    m = sync_mode if m == EX and sync_mode == SH

    runnable = false
    case m
    when UN
      Err::UnknownLocker.Fail(Thread.current)

    when EX
      if sync_ex_locker == Thread.current
        if (self.sync_ex_count = sync_ex_count - 1) == 0
          self.sync_ex_locker = nil
          if sync_sh_locker.include?(Thread.current)
            self.sync_mode = SH
          else
            self.sync_mode = UN
          end
          runnable = true
        end
      else
        Err::UnknownLocker.Fail(Thread.current)
      end

    when SH
      if (count = sync_sh_locker[Thread.current]).nil?
        Err::UnknownLocker.Fail(Thread.current)
      else
        if (sync_sh_locker[Thread.current] = count - 1) == 0
          sync_sh_locker.delete(Thread.current)
          if sync_sh_locker.empty? and sync_ex_count == 0
            self.sync_mode = UN
            runnable = true
          end
        end
      end
    end

    if runnable
      if sync_upgrade_waiting.size > 0
        th, count = sync_upgrade_waiting.shift
        sync_sh_locker[th] = count
        th.wakeup
        wakeup_threads.push th
      else
        wait = sync_waiting
        self.sync_waiting = []
        for th in wait
          th.wakeup
          wakeup_threads.push th
        end
      end
    end
  end
  for th in wakeup_threads
    th.run
  end
  self
end

私有实例方法

sync_initialize() 显示源

# File lib/sync.rb, line 255
def sync_initialize
  @sync_mode = UN
  @sync_waiting = []
  @sync_upgrade_waiting = []
  @sync_sh_locker = Hash.new
  @sync_ex_locker = nil
  @sync_ex_count = 0

  @sync_mutex = Thread::Mutex.new
end

sync_try_lock_sub(m) 显示源

# File lib/sync.rb, line 271
def sync_try_lock_sub(m)
  case m
  when SH
    case sync_mode
    when UN
      self.sync_mode = m
      sync_sh_locker[Thread.current] = 1
      ret = true
    when SH
      count = 0 unless count = sync_sh_locker[Thread.current]
      sync_sh_locker[Thread.current] = count + 1
      ret = true
    when EX
      # in EX mode, lock will upgrade to EX lock
      if sync_ex_locker == Thread.current
        self.sync_ex_count = sync_ex_count + 1
        ret = true
      else
        ret = false
      end
    end
  when EX
    if sync_mode == UN or
        sync_mode == SH && sync_sh_locker.size == 1 && sync_sh_locker.include?(Thread.current)
      self.sync_mode = m
      self.sync_ex_locker = Thread.current
      self.sync_ex_count = 1
      ret = true
    elsif sync_mode == EX && sync_ex_locker == Thread.current
      self.sync_ex_count = sync_ex_count + 1
      ret = true
    else
      ret = false
    end
  else
    Err::LockModeFailer.Fail m
  end
  return ret
end
Ruby 2.4

Ruby 是一种面向对象、命令式、函数式、动态的通用编程语言,是世界上最优美而巧妙的语言。

主页 https://www.ruby-lang.org/
源码 https://github.com/ruby/ruby
版本 2.4
发布版本 2.4.1

Ruby 2.4目录

1.缩略 | Abbrev
2.ARGF
3.数组 | Array
4.Base64
5.基本对象 | BasicObject
6.基准测试 | Benchmark
7.BigDecimal
8.绑定 | Binding
9.CGI
10.类 | Class
11.比较 | Comparable
12.负责 | Complex
13.计算续体 | Continuation
14.覆盖 | Coverage
15.CSV
16.日期 | Date
17.日期时间 | DateTime
18.DBM
19.代理 | Delegator
20.摘要 | Digest
21.Dir
22.DRb
23.编码 | Encoding
24.枚举 | Enumerable
25.枚举 | Enumerator
26.ENV
27.ERB
28.错误 | Errors
29.Etc
30.期望值 | Exception
31.错误类 | FalseClass
32.Fiber
33.Fiddle
34.文件 | File
35.文件实用程序 | FileUtils
36.查找 | Find
37.浮点 | Float
38.Forwardable
39.GC
40.GDBM
41.GetoptLong
42.Hash
43.Integer
44.IO
45.IPAddr
46.JSON
47.Kernel
48.语言 | 3Language
49.记录 | Logger
50.编排 | Marshal
51.MatchData
52.数学 | Math
53.矩阵 | Matrix
54.方法 | Method
55.模型 | Module
56.监控 | Monitor
57. 互斥 | Mutex
58.Net
59.Net::FTP
60.Net::HTTP
61.Net::IMAP
62.Net::SMTP
63.NilClass
64.数字 | Numeric
65.对象 | Object
66.ObjectSpace
67.Observable
68.Open3
69.OpenSSL
70.OpenStruct
71.OpenURI
72.OptionParser
73.路径名 | Pathname
74.完整输出 | PrettyPrint
75.Prime
76.Proc
77.过程 | Process
78.PStore
79.PTY
80.队列 | Queue
81.随机 | Random
82.范围 | Range
83.合理的 | Rational
84.Readline
85.Regexp
86.Resolv
87.Ripper
88.RubyVM
89.Scanf
90.SDBM
91.SecureRandom
92.Set
93.Shell
94.信号 | Signal
95.Singleton
96.套接字 | Socket
97.字符串 | String
98.StringIO
99.StringScanner
100.结构 | Struct