在 Ruby 中实现同步屏障

2023-11-22

我正在尝试“复制” CUDA 的行为__synchtreads()Ruby 中的函数。具体来说,我有一组N需要执行某些代码的线程,然后在继续执行其余业务之前,所有线程都在执行中点互相等待。例如:

x = 0

a = Thread.new do
  x = 1
  syncthreads()  
end

b = Thread.new do 
  syncthreads()
  # x should have been changed
  raise if x == 0
end

[a,b].each { |t| t.join }

我需要使用什么工具来完成此任务?我尝试使用全局哈希,然后休眠,直到所有线程都设置了一个标志,表明它们已完成代码的第一部分。我无法让它正常工作;这导致了挂起和死锁。我think我需要结合使用Mutex and ConditionVariable但我不确定为什么/如何。

Edit:50 次浏览,无人回复!看起来像是赏金的候选人......


让我们实现一个同步屏障。它必须知道它将处理的线程数,n,在前面。在第一次期间n - 1打电话给sync屏障将导致调用线程等待。电话号码n将唤醒所有线程。

class Barrier
  def initialize(count)
    @mutex = Mutex.new
    @cond = ConditionVariable.new
    @count = count
  end

  def sync
    @mutex.synchronize do
      @count -= 1
      if @count > 0
        @cond.wait @mutex
      else
        @cond.broadcast
      end
    end
  end
end

全身的sync是临界区,即它不能由两个线程同时执行。因此呼吁Mutex#synchronize.

当值减小时@count为正则线程被冻结。将互斥体作为参数传递给调用ConditionVariable#wait对于防止死锁至关重要。它会导致互斥体在冻结线程之前解锁。

一个简单的实验启动 1k 线程并使它们向数组添加元素。首先他们添加零,然后同步并添加1。预期结果是一个包含 2k 个元素的排序数组,其中 1k 个是 0,1k 个是 1。

mtx = Mutex.new
arr = []
num = 1000
barrier = Barrier.new num
num.times.map do
  Thread.start do
    mtx.synchronize { arr << 0 }
    barrier.sync
    mtx.synchronize { arr << 1 }
  end
end .map &:join;
# Prints true. See it break by deleting `barrier.sync`.
puts [
  arr.sort == arr,
  arr.count == 2 * num,
  arr.count(&:zero?) == num,
  arr.uniq == [0, 1],
].all?

事实上,有名为屏障的宝石这正是我上面描述的。

最后一点,在这种情况下不要使用睡眠来等待。它被称为忙着等待 and 被认为是一种不好的做法.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Ruby 中实现同步屏障 的相关文章

  • Ruby on Rails:有关 validates_presence_of 的问题

    我的基于 ActiveRecord 的模型中有一个关系 如下所示 belongs to foo 我的模型应该始终在其中定义 foo 才能有效 我的问题是 当使用 validates presence 时 使用哪一个是合适的 validate
  • Ruby 自定义字符串排序

    输入字符串 1654AaBcDddeeFF 输出字符串 1456acddeeABDFF 我尝试过的代码 test array 1654AaBcDddeeFF each byte do char test array lt lt char e
  • 使用 ActiveRecord::Relation 时的 RSpec 匹配器

    所以这是我要测试的方法 def self by letter letter where lastname LIKE letter order lastname end 简单问一下 letter 后面的百分号到底有什么作用 跟格式化有关系吗
  • Rails 中的“class << self”是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 Ruby 中的 class https stackoverflow com questions 2505067 class self idiom in ruby有人可以向我解释一下 class htt
  • Rails3 has_many 关系中子项计数的范围

    尝试在rails3中做一个范围 book has many chapters 我想要 range long 返回超过 10 章的书籍 如何最好地构建这个范围 不使用计数器缓存 thanks 这应该会让你继续 class Book scope
  • 捆绑安装到开发

    由于某种原因 当我跑步时bundle install它安装到生产中 Your bundle is complete It was installed into RAILS ENV production Arrrghh 我如何切换回开发 No
  • Rspec:期望与期望与块 - 有什么区别?

    刚刚学习 rspec 语法 我注意到这段代码有效 context given a bad list of players do let bad players it fails to create given a bad player li
  • 为什么我的多螺纹嵌件比单螺纹嵌件性能更好?

    我调查了并发性 http docs mongodb org manual faq concurrency how granular are locks in mongodb在 MongoDB 中 显然它使用了数据库级锁定系统 我认为这意味着
  • rspec 测试 has_many :through 和 after_save

    我有一个 我认为 相对简单的has many through与连接表的关系 class User lt ActiveRecord Base has many user following thing relationships has ma
  • 随机显示 NoMethodError:未定义的方法“空?”对于 0:Fixnum

    它在我的本地计算机上运行良好 但使用 Puma Web 服务器在 Heroku 上的rails admin 中出现以下错误 这是我使用 enumerize 的方式 enumerize date type in last date 0 beg
  • Play 框架:异步与同步性能

    我有以下代码 def sync Action val t0 System nanoTime Thread sleep 100 val t1 System nanoTime Ok Elapsed time t1 t0 1000000 0 ms
  • 如何在 Ruby 中转义单引号?

    我通过一个脚本 不是我的 将一些 JSON 传递到服务器 该脚本接受 JSON 作为字符串 JSON 的某些内容包含单引号 因此我想确保在传递给脚本之前对所有单引号进行转义 我已经尝试过以下方法 gt irb gt 1 9 3p194 00
  • Ruby openssl 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有 Ruby 的在线文档openssl图书馆 我能找到的只是博客文章和第三方文章 而 rdoc 本
  • 如何检查用户电子邮件的唯一性并将结果传递给 jQuery?

    我有这个问题 我正在控制器中检查用户电子邮件并发送 json 成功响应 如果已获取 并添加输入的 css 样式 我还需要阻止提交并添加一些消息 这是我的检查电子邮件操作 使用本文 http paydrotalks com posts 45
  • 是否可以在Java中检查CPU是否是超线程的?

    我想知道可以运行的最佳线程数 通常 这等于Runtime getRuntime availableProcessors 但是 在支持超线程的 CPU 上 返回的数字是其两倍 现在 对于某些任务来说 超线程是好的 但对于其他任务来说 它没有任
  • JavaScript 执行 Ruby 脚本

    服务器 客户端是同一个盒子 创建一个 UI 以在本地运行 ruby 测试脚本 我想要执行 ActiveXObject 之类的东西 w new ActiveXObject WScript Shell w run test rb 文件结构如下
  • 在 Ruby 中转义字符串

    我想在某些 Ruby 中插入以下内容作为变量的值 lt gt 用双引号将其引起来是行不通的 那么是否有一个很好的 escape until the end 之类的东西可用 不要使用多种方法 保持简单 转义 反斜杠和双引号 irb main
  • 使用 boost 线程和非静态类函数

    所以我做了一些研究 发现你可以创建一个 boost thread 对象 并通过使用 this 和 boost bind 等以非静态类函数开头 这确实没有多大意义对我来说 我能找到的所有示例都在与其启动的函数相同的类中启动了 boost th
  • 在Ruby中做每个,如何在每n个项目中放置一个br

    假设我有 10 个项目要迭代 我想每 3 个项目放置一个 br 就像这个例子一样 我怎样才能在 Ruby 中做到这一点 1 2 3 br 4 5 6 br 7 8 9 br 10 解决方案1 1 10 each slice 3 a puts
  • 为什么我不能“string”.print()?

    我的理解print 在 Python 和 Ruby 以及其他语言 中 它是字符串 或其他类型 上的方法 因为它的语法非常常用 打印 嗨 works 那么为什么不呢 hi print 在 Python 中或 hi print在红宝石工作 当你

随机推荐

  • mysql 查询“SHOW COLUMNS FROM table like 'columnname'”:问题

    我有一个问题SHOW COLUMNS FROM table like column name 我已经尝试过一些测试一段时间了 它似乎类似于 哪里column name column 不过 我只是想确认一下 预先非常感谢你 另外 我想说 为什
  • 如何求负整数的立方根,使其不返回 NaN?

    在 Haskell 中 我尝试找到负整数 例如 1 的立方根 但没有成功 我使用了 1 1 3 但这会返回 NaN 我认为这可能与 1 3 分数的类型有关 但使用 1 3 Double 也没有成功 因此 我的问题是如何使用 Haskell
  • 以编程方式从共享邮箱发送 Outlook 电子邮件

    我正在尝试使用 python 从共享邮箱发送电子邮件 我已经能够通过自己的电子邮件成功发送它 但是使用共享邮箱 我已经测试过我也可以访问 发送邮件给我带来了问题 python 中用于电子邮件脚本的代码 import win32com cli
  • Postgresql 中的 JSON 输出

    我希望我没有遗漏一些非常明显的东西 我想从 postgres 函数获取 JSON 输出 我想许多其他函数已经需要这个 并且我很乐意在我的服务器上安装 contrib 函数的扩展 有没有办法从 sql 或 plpgsql 函数获取 JSON
  • 停止从 IIS 7.5 中的父 ASP.NET 应用程序继承 web.config

    我们在 IIS 7 5 中部署了 ASP NET 网站 应用程序 1 然后在该应用程序下创建另一个 ASP NET 应用程序 应用程序 2 但在App 2中 我不想继承web config来自应用程序 1 如果我尝试在 App 1 中执行以
  • 有没有办法以编程方式关闭 WPF 中的菜单项

    我在 wpf 中有一个菜单 上面有一个输入框和一个按钮 一旦用户单击按钮 我需要关闭菜单 有没有办法做到这一点 menu menu
  • C++中的非静态函数可以修改静态变量吗

    C 中的非静态函数可以修改静态变量吗 是的 只要数据成员的可见性允许 非静态成员函数就可以修改静态数据成员
  • 运行 tweepy 的 Airflow 任务退出并返回代码 -6

    我有一个简单的 Airflow DAG 它只有一个任务 stream from twitter to kafka 以下是 DAG 的代码 default args owner me depends on past False start d
  • 如何知道适合固定大小的 UILabel 的 NSString 长度?

    我知道 NSString 有确定其帧大小的方法 使用 NSString UIKit Additions sizeWithFont 反过来又如何呢 我的意思是 如果我有固定的框架大小 我如何知道 NSString 可以容纳多少个字符或单词 如
  • Pods 依赖项的 Xcode 10 多个命令构建错误

    Multiple commands produce Users abc Library Developer Xcode DerivedData MyProject cworwzaxajsmfkcfvourofovbggd Build Pro
  • 错误:静态成员函数中的成员使用无效

    我有两个类 这是其中一个类的标题 ifndef WRAPPER HPP define WRAPPER HPP include
  • 跳过调试器中的当前行

    有没有办法使用键盘快捷键跳过 Visual Studio 调试器中的当前行 我能够做到这一点的唯一方法是使用左侧的黄色光标或 设置下一个语句 这在函数末尾不起作用 设置下一条语句 CTRL SHIFT F10 快捷方式将在函数末尾起作用 但
  • 谷歌地图与离子

    我正在尝试使用 google 地图和 Ionic 来实现地图 我按照这个编码Link但我得到的只是一个空白屏幕 不知道哪里出了问题 请帮忙 这是控制器 angular module starter ionic controller MapC
  • 如何从日期时间创建日期(使用 lubridate)?

    假设我创建了一个包含日期和时间的变量 a lt ymd hms 2014 01 01 12 23 34 如何创建另一个只有日期的变量 也就是我应该怎么做才能转型a的值等于b的值在哪里b is b lt ymd 2014 01 01 你可以只
  • 如何在按下返回键时快速隐藏键盘?

    I am using UITextfied while clicking on textfied keyboard appear but when i pressed the return key keyboard is not disap
  • password_hash、password_verify、MySQL的误解?

    我似乎无法让这个测试显示数据库中的哈希密码 它可以很好地显示表单中的密码 尝试进行此测试以找出为什么我无法将表单中的密码与数据库中存储的密码进行比较来验证密码 我读到了一些关于转义哈希中的 符号的内容 但我不确定如何使用我正在使用的代码来做
  • locale什么时候影响R的正则表达式?

    R 有几个用于正则表达式的特殊的与语言环境无关的字符类 From regex alnum 表示 0 9A Za z 后者除外 取决于区域设置和字符编码 而 前者独立于区域设置和字符集 我想知道何时会出现特定于区域设置的问题 我根据中的信息尝
  • Powerpoint:手动设置幻灯片名称

    Context C 中的 PowerPoint 幻灯片有一个属性 Slide Name 通常包含任意字符串值 在我的 C 应用程序中 我想使用此属性来识别幻灯片 幻灯片顺序不可靠 问题 如何在 PowerPoint 应用程序中手动设置 Sl
  • 免费网络监控器

    我在集成两种产品时遇到问题 其中一种是我的 但它们似乎没有说话 所以我想确保他们的沟通正确 我查看了网络监视器并发现了 TCP Spy 这有效 但一次只显示对话的一侧 它必须在本地运行 我理想情况下希望同时看到双方 但你不能运行 TCP S
  • 在 Ruby 中实现同步屏障

    我正在尝试 复制 CUDA 的行为 synchtreads Ruby 中的函数 具体来说 我有一组N需要执行某些代码的线程 然后在继续执行其余业务之前 所有线程都在执行中点互相等待 例如 x 0 a Thread new do x 1 sy