Ruby中并发的同步方法

可能重复:
ruby是否具有Java等效的synchronize关键字?

在Java中,我们可以通过在函数定义中使用’synchronized’关键字来使方法“同步”。

我们如何在Ruby中做到这一点?

Ruby中不存在Synchronize关键字。 或者只是将方法调用包装到Mutex (即用于Lock的花哨字)。

为该类创建新的共享互斥锁(每个人都必须使用相同的互斥锁(锁)来访问相同的变量):

 NUM_THREADS = 4 class Foo def initialize @my_mutex = Mutex.new @my_val = 0 # should be private end def synchronize(&block) # to see what it does without the mutex in this example: # 1) comment this line @my_mutex.synchronize(&block) # 2) uncomment this line # yield end def current_value synchronize do @my_val end end def modify # the value should be 0 before and 0 after, if the Mutex is used correctly synchronize do @my_val += 1 sleep 0.25 @my_val -= 1 sleep 0.25 end end end foo = Foo.new threads = [] # spawn N threads, all trying to change the value threads += (1..NUM_THREADS).map { |i| Thread.new { puts "thread [##{i}]: modifying" foo.modify } } # spawn checking thread threads << Thread.new { # print the value twice as fast as the other threads are changing it, so we are more likely to stumble upon wrong state (NUM_THREADS * 2).times { puts "thread [check]: checking..." raise if foo.current_value != 0 # locking failed, crash sleep 0.25 } } threads.map { |t| t.join } # wait for all threads puts "even though it took a while longer, it didn't crash, everyone is happy, managers didn't fire me... it worked!" 

请参阅http://apidock.com/ruby/Mutex

由于所有这些锁定,程序运行时间更长。 速度取决于您的ruby实现(例如绿色线程,本机线程......)和核心数量。 如果您在上面的示例中禁用了互斥锁,程序会立即崩溃,因为检查线程中有加强保护。 请注意,检查线程也必须使用互斥锁,否则它仍然能够在其他线程的更改中读取值。 即每个人都必须使用相同的互斥锁来访问该变量。

为了解决缺少synchronized关键字的问题,我定义了使用类定义的Mutex方法synchronize