Ruby on rails Rails应用中的线程安全

Ruby on rails Rails应用中的线程安全,ruby-on-rails,multithreading,Ruby On Rails,Multithreading,如果我的代码在一个变量上有一个糟糕的竞态条件,并且我的Rack::Lock middleware被config.threadsafe禁用,结果与它不一致选项,如何确保在线程服务器上的应用程序中避免线程安全问题?我必须采取什么措施 在线程化/多进程服务器上执行它的方式是否有差异 更新 这是一篇具有竞争条件的文章中的代码片段: class UsersController < ApplicationController @counter = 0 class << self at

如果我的代码在一个变量上有一个糟糕的竞态条件,并且我的
Rack::Lock middleware
config.threadsafe禁用,结果与它不一致选项,如何确保在线程服务器上的应用程序中避免线程安全问题?我必须采取什么措施

在线程化/多进程服务器上执行它的方式是否有差异

更新

这是一篇具有竞争条件的文章中的代码片段:

class UsersController < ApplicationController
 @counter = 0

class << self
 attr_accessor :counter
end

trap(:INFO) {
$stderr.puts "Count: #{UsersController.counter}"
}

def index
  counter = self.class.counter # read
  sleep(0.1)
  counter += 1                 # update
  sleep(0.1)
  self.class.counter = counter # write

  @users = User.all

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @users }
  end
end
class UsersController类竞争条件的两个组成部分是共享资源和对它的并发访问,以消除竞争条件-消除其中一个(或两者)

所以,如果绝对不能避免全局变量(类变量实际上也是全局的),那么就使用互斥消除并行访问

self.class.semaphore = Mutex.new


但是,对于许多复杂的同步,如果某些代码要求同时锁定两个互斥锁,则可能会遇到死锁问题,因此,最好首先不要共享资源。

如果你想要的答案不仅仅是理论上的,你应该包括有问题的代码。我添加了代码片段。计数器实际上做什么?
self.class.semaphore.synchronize{ 
    #here goes your unsafe code
    self.class.counter += 1
}