require 'thread'

mutex = Mutex.new


shared_resource = 0

  for i in 0..10000
    Thread.new do
      mutex.synchronize { shared_resource += 1 }
    end
    Thread.new do
      mutex.synchronize { shared_resource -= 1 }
    end
  end

puts shared_resource

我试着运行这个Ruby程序来测试互斥锁.synchronize并在每次运行时得到0,但每次我运行这个程序时它都会给我随机值.需要帮助解决这个问题,以获得0,并帮助我了解如何在Ruby中使用互斥锁和锁

推荐答案

您的问题不是互斥体,因为同步会在块执行期间锁定它.你的问题是当你达到puts shared_resource时,线程执行尚未完成.

为了解决这个问题,你需要通过调用Thread#join来确保所有线程都完成了,例如:

require 'thread'

mutex = Mutex.new

shared_resource = 0
threads = []

400.times do |i|
  threads << Thread.new do
    mutex.synchronize {shared_resource += 1}
  end
  threads << Thread.new do
    mutex.synchronize {shared_resource -= 1}
  end
end

puts shared_resource
#=> some number

# see how many threads are still running 
puts threads.map(&:status)

threads.map(&:join)

puts shared_resource
#=> 0 

Ruby-on-rails相关问答推荐

在has_many关系中由两个条件 Select

如何在嵌套路由中使用Ruby on rails多态关联

插件和 Ruby gem 之间的区别?

Rails 自动加载完全大写的名称,如 API

循环大量记录时 Ruby on Rails 内存泄漏; find_each 没有帮助

如何在 Ruby 字符串中返回最后一个斜杠(/)之后的所有内容

如何确定 Rails 是从 CLI、控制台还是作为服务器运行?

我如何存根 find_each 以在 rails 3 中进行 rspec 测试

使用 SQLite 3 将 RoR 应用程序部署到 Heroku 失败

如何在我的 Gemfile 中找到未使用的Ruby

为什么我要使用 unicorn 或 thin 而不是 WEBrick 用于开发目的?

关闭 Firefox 中文本字段的自动完成功能

Ruby on Rails 基本概念总结

Ruby - 合并两个数组并删除重复的值

'respond_to' 格式语句中的 `:location => ...` 和 `head :ok` 是什么意思?

如何一次显示一条 Ruby on Rails 表单验证错误消息?

我是否必须手动卸载所有依赖的 gem?

测试和规格有什么区别?

如何拆分长行的 Ruby

警告:运行 ruby​​ 或 gem 命令时不安全的世界可写目录