共享互斥体的交替例程

2024-03-18

我有方法a在某个随机时间重复调用,从而触发方法b,它在一段随机时间后完全执行,并且在它自己的线程中。我想确保随后执行a等到b已完成,由当前执行触发a。换句话说,a and b均须交替执行。我尝试使用互斥体和条件变量来执行此操作,如下所示:

def a
  Thread.new do
    $mutex.synchronize do
      puts "a"
      b
      $cv.wait($mutex)
    end
  end
end

def b
  Thread.new do
    sleep(rand)
    $mutex.synchronize do
      puts "b"
      $cv.signal
    end
  end
end

$mutex, $cv = Mutex.new, ConditionVariable.new
loop{a; sleep(rand)}

在这段代码中,$mutex.synchronize do ... end在方法中a确保$cv.signal(也在另一个$mutex.synchronize do ... end) 在方法中b直到$cv.wait($mutex) sets $cv进入信号监听模式。这么多是在该文件 http://ruby-doc.org/stdlib-2.0.0/libdoc/thread/rdoc/ConditionVariable.html.

我打算分配给的另一个功能$mutex.synchronize do ... end在方法中a是为了避免方法的连续执行a。我的理由是$cv.wait($mutex)在方法中a应该避免$mutex从完成并发布直至$cv.signal在方法中b被调用,此时b应该完成。

我期望a and b交替执行,从而打印"a" and "b"或者。但事实上,它们并非如此。每一个"a" or "b"可以连续打印。


之后,我认为我上面的推理可能是错误的,因为$mutex即使已经完成并发布$cv (or $mutex) 处于等待模式,一次$cv.wait($mutex)已经called。所以我添加了一些虚拟进程a,将其更改为:

def a
  Thread.new do
    $mutex.synchronize do
      puts "a"
      b
      $cv.wait($mutex)
      nil # Dummy process intended to keep `$mutex` locked until `$cv` is released
    end
  end
end

但这没有效果。


如何解决这个问题?或者说,我这件事有什么错吗?


我没有办法给你解决办法,但这不是原因a接到的电话比您预期的要多wait释放互斥锁上的锁?否则signal永远无法被调用。这似乎第一次“如预期”发生,但在那之后,你最终会得到几个a线程排队,渴望进入synchronize块,他们在一个b线程唤醒并再次锁定互斥体。

如果你每次都对你的代码进行检测,你会看到它发生:

def a
  puts("a before thread #{Thread.current}")
  Thread.new do
    puts(" a synch0 #{Thread.current}")
    $mutex.synchronize do
      puts("  a before b #{Thread.current}")
      b
      puts("  a after b, before wait #{Thread.current}")
      $cv.wait($mutex)
      puts("  a after wait #{Thread.current}")
    end
    puts(" a synch1 #{Thread.current}")
  end
  puts("a after thread #{Thread.current}")
end

def b
  puts("b before thread #{Thread.current}")
  Thread.new do
    puts(" b before sleep #{Thread.current}")
    sleep(rand)
    puts(" b after sleep, synch0 #{Thread.current}")
    $mutex.synchronize do
      puts("  b before signal #{Thread.current}")
      $cv.signal
      puts("  b after signal #{Thread.current}")
    end
    puts(" b synch1 #{Thread.current}")
  end
  puts("b after thread #{Thread.current}")
end

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

共享互斥体的交替例程 的相关文章

  • 将数据从一个线程传递到另一个线程的最快可能方法

    我正在使用增强spsc queue将我的东西从一个线程移动到另一个线程 这是我的软件中的关键位置之一 所以我想尽快完成它 我写了这个测试程序 include
  • 使用 boost::thread 特定的 ptr<>::get() 是否会很慢?有什么解决方法吗?

    我目前正在使用 Valgrind 的 Callgrind 分析一个存在性能问题的应用程序 在查看分析数据时 似乎有 25 的处理时间花费在boost detail get tss data在主要目的是物理模拟和可视化的应用程序中 get t
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁
  • 如何从 Rails 中的 date_select 或 select_date 获取日期?

    Using select date给我回一个params my date with year month and day属性 如何轻松获取 Date 对象 我希望有类似的事情params my date to date 我很高兴使用date
  • 在 Python 中打印守护线程异常

    Python 不会打印守护线程中引发的异常的回溯消息 例如 以下代码创建一个守护线程并在新线程中引发异常 def error raiser raise Exception import threading thread threading
  • Python 2.7:支持一个端口上多个连接的流式 HTTP 服务器

    我正在寻找一个标准的Python 2 7包 提供一个同时执行的HTTP服务器流媒体同一端口号上的连接 嘿 各位版主 请停止将我的问题标记为想要以非流媒体方式提供服务的问题的重复项 例如 python 中的多线程 Web 服务器 https
  • Rails 4:资产未在生产中加载

    我正在尝试将我的应用程序投入生产 但图像和 CSS 资源路径不起作用 这是我目前正在做的事情 图像资源位于 app assets images image jpg 样式表位于 app assets stylesheets style css
  • Rails 3 在 Ruby 1.9.2 上初始化非常慢

    我使用 RVM 来管理环境 安装了 Ruby 1 9 2 p136 我认为是最新版本 和 Rails 3 创建了 gemset 并运行捆绑器 到目前为止一切正常 但 Rails 在运行命令 即生成 销毁 rake 等 时初始化速度非常慢 完
  • 使用 VCR 过滤敏感数据

    我正在使用 VCR gem 记录 http 交互并在将来重播它们 我想过滤掉 uri 请求中的实际密码值 以下是 uri 的示例 http services somesite com Services asmx Cabins Usernam
  • 我在 Rails 中使用了保留字吗?

    这是我的模型 class Record lt ActiveRecord Base belongs to user belongs to directory end class Directory lt ActiveRecord Base h
  • 当底层连接是有状态时如何使用 Apache HttpClient?

    我在谷歌上搜索了很多关于如何使用 HttpClient 进行多线程处理的信息 他们中的大多数人建议使用 ThreadSafeClientConnManager 但我的应用程序必须登录某个主机 登录表单页面 以便 HttpClient 获得底
  • Rails - 渲染:目标锚标记的操作?

    我希望像这样使用渲染 render action gt page form 我也尝试过这个 render template gt site page form 那也没用 这个特定页面上的表单位于最底部 如果提交时发生任何错误 我不希望用户被
  • 奇怪的跨线程 UI 错误

    我正在编写一个 WinForms 应用程序 它有两种模式 控制台或 GUI 同一解决方案中的三个项目 一个用于控制台应用程序 一个用于 UI 表单 第三个用于保存两个界面也将连接的逻辑 控制台应用程序运行绝对流畅 保存用户选择的模型 它有一
  • 没有要加载的文件 - ffi_c (LoadError)

    这个问题困扰了我几天 每当我使用 bring to front 方法时 require rubygems require watir browser Watir Browser new browser bring to front 我收到此
  • 多线程Spring-boot控制器方法

    因此 我的应用程序 spring boot 运行速度非常慢 因为它使用 Selenium 来抓取数据 处理数据并显示在主页中 我遇到了多线程 我认为它对我的应用程序很有用 可以让它运行得更快 但是教程似乎显示在带有 main c 的普通 j
  • ruby从1.8.7升级到1.9.2(使用Rails 3.1.1)后本地服务器错误

    我刚刚安装了rvm并使用rvm将ruby从1 8 7升级到1 9 2 我在我的应用程序上运行了捆绑安装 它重新安装了我的 gems 当我在本地运行 Rails 服务器并将浏览器导航到 localhost 3000 时 服务器日志中显示以下错
  • 在不支持线程的程序加载的共享库中使用 C++11 多线程

    我目前正在尝试在共享库中使用 C 11 多线程 该库加载到 Linux 上的主程序 用 C 编写 中 这是一个大型模拟程序的一部分 我无法更改有关库加载的任何内容或更改一般的主程序 主程序是用 gcc 4 1 2 编译的 我没有它的源代码
  • ruby 正则表达式匹配模式的多次出现

    我正在寻找构建一个 ruby 正则表达式来匹配模式的多次出现并将它们返回到数组中 模式很简单 即 两个左括号 一个或多个字符 后跟两个右括号 这就是我所做的 str Some random text lead first name and

随机推荐

  • 将结构中的字节数组传递给 com 对象

    我写了一个 C COM 服务器 进程外 和客户端 idl 接口是IDispatch typedef uuid 0952A366 20CC 4342 B590 2D8920D61613 struct MyStruct LONG id BYTE
  • 如何将 where 子句附加到使用 Spring Data MongoRepository 运行的所有查询?

    我有持久保存在 MongoDB 中并使用 spring 数据的实体MongoRepository获取数据 现在我想将过滤器应用于在实体上执行的所有查询 所以我决定使用休眠过滤器 如下所示 Entity QueryEntity Documen
  • 如何从我的 iOS 应用程序向 Mac 应用程序发送 MIDI 或 OSC 信号?

    我正在考虑编写一个 iPhone iPad 应用程序来模拟 MIDI 控制器 我知道已经有很多可用的 但我仍然想自己做 我对此有几个问题 我对 MIDI 了解一点 但最近听说了 OSC 显然 几乎所有 DJ 软件应用程序都支持 MIDI 但
  • ActionFilter 和 ResultFilter 的不同和示例

    我无法理解 ActionFilter 和 ResultFilter 之间的区别 执行OnActionExecuted方法后的ResultFilter 您能否解释一下 ActionFilter 和 ResultFilter 的主要区别和示例
  • 用Java读取纯文本文件

    Java 中读取和写入文件数据的方式似乎有不同 我想从文件中读取 ASCII 数据 有哪些可能的方式以及它们的区别 我最喜欢的读取小文件的方法是使用 BufferedReader 和 StringBuilder 它非常简单明了 虽然不是特别
  • 在常规反应中,如何在提交或“输入”键上关闭移动键盘?

    我试图找到这个答案 但我发现的所有其他问题都是 React Native handleEnter e if e key Enter REMOVE KEYBOARD 我的输入也是文本搜索 所以我希望键盘隐藏 以便用户可以看到出现的结果 e t
  • 在 JasperReport 中创建/传递 Java bean 数据源

    我在 JSF 应用程序中使用 JasperReport 和 ireport 来动态生成报告 这就是我想要实现的目标 我的结构 读为 HashMap ArrayList 包含需要传递到报告的数据 以便在报告中显示相同的数据 我的报告已经包含一
  • 用 C 编写安全标记联合

    假设你正在写一个C struct它代表一顿饭中的一道菜 课程领域之一struct属于类型 enum TP course STARTER MAINCOURSE DESSERT 然后 根据课程的类型 您有一个子类型 enum TP starte
  • React Native StatusBar:深色内容在 Android 上不起作用

    我正在尝试将标题的颜色和状态栏的图标更改为黑色 所以 根据react native状态栏文档 我设置了barStyle to dark content但没有任何改变
  • C99 中的引用传递

    我刚刚读过this http cartan cas suffolk edu oopdocbook opensource passreference html 在C 和C99 中 我们可以绕过 参考 它提供了相同的 性能相当于指针传递 所以我
  • 如何将 Quickbook 桌面应用程序与网站集成

    我是 Quick Book 的新人 现在我正在准备一个管理面板 在线网站 其中我必须与 Quick Book 桌面版本集成 我正在使用 NET C 平台制作这个网站 这里有一些帖子 但我仍然不清楚 简而言之 我的要求是 我们需要发送提供商名
  • javascript 函数在 jquery $(document).ready 块中不起作用

    我正在尝试打电话JavaScript函数从onclick扳机 HTML部分 div class my radio div
  • 如何使用 Sublime Text 运行节点应用程序

    如何使用 Sublime Text 运行节点应用程序 像这样 在sublime中打开app js文件 进入菜单 gt 工具 gt 构建 它 就运行了 就这么简单 Cmd Shift P 搜索 Nodejs Default File Sett
  • 反序列化 MongoDB BSON

    我尝试从查询 MongoDB 实例的 REST 服务获取响应并将响应解析为 Java 对象 Web 服务使用 MIME 类型的 html 返回响应 并用换行符分隔返回的每个记录 尽管我能够调整服务返回的内容 将 BSON 响应转换为 Jav
  • 自动更新数据库Mysql中的库存

    我需要了解数据库中的一件事 我有产品表及其总库存 如图所示 如果有人知道我该怎么做 请分享 谢谢 当提到关系数据库时 您所问的问题在技术上并不是技术意义上的 关系 这种关系就像有一个表引用另一个表的 键 例如将具有客户地址的表与具有客户订单
  • Azure - 启动命令 - 无法访问 jarfile app.jar

    我有一个 Java Spring Boot 应用程序 部署在 Azure Web 服务上 一切正常 我此刻真正想做的是 java jar Dspring profiles active test app jar 我想通过 Azure 云上的
  • 将 msbuild 任务作为 nuget 传送

    我需要你的帮助 我正在开发一个 msbuild 任务 该任务对 msbuild 执行某些操作 我希望我的用户能够下载并安装 nuget 包 安装包后 构建任务将成为构建过程的一部分 我知道如何发布 nuget 包 并且知道如何将自定义目标文
  • C++:受保护的类构造函数

    如果一个类总是要被继承 那么创建构造函数是否有意义protected class Base protected Base class Child protected Base public Child Base Thanks 仅当您不希望客
  • tsql 脚本来查找未被存储过程、视图、函数等使用的表?

    是否有一个 t sql 脚本来找出 sql server 中没有通过存储过程 视图 函数等使用的表 我有一个数据库 有 100 个表 如果不是更多的话 在我删除表之前 我想知道是否有一个脚本可以遍历数据库中的每个对象并告诉我是否有任何表正在
  • 共享互斥体的交替例程

    我有方法a在某个随机时间重复调用 从而触发方法b 它在一段随机时间后完全执行 并且在它自己的线程中 我想确保随后执行a等到b已完成 由当前执行触发a 换句话说 a and b均须交替执行 我尝试使用互斥体和条件变量来执行此操作 如下所示 d