可重复使用的Barrier解决方案陷入僵局?

2023-12-30

我一直在读《The Little Book of Semaphores》,第 41 页有一个针对可重用屏障问题的解决方案。我遇到的问题是为什么它不会产生死锁情况。

1 # rendezvous
2
3 mutex.wait()
4     count += 1
5     if count == n:
6         turnstile2.wait() # lock the second
7         turnstile.signal() # unlock the first
8 mutex.signal()
9
10 turnstile.wait() # first turnstile
11 turnstile.signal()
12
13 # critical point
14
15 mutex.wait()
16     count -= 1
17     if count == 0:
18         turnstile.wait() # lock the first
19         turnstile2.signal() # unlock the second
20 mutex.signal()
21
22 turnstile2.wait() # second turnstile
23 turnstile2.signal()

在此解决方案中,第 15 行和第 20 行之间,在持有互斥锁的同时对信号量(第 18 行)调用 wait() 会导致死锁,这不是一个坏习惯吗?请解释。谢谢。


mutex保护count多变的。第一个互斥锁涉及递增计数器以说明每个线程以及最后一个进入的线程(if count == n)锁定第二个 tunstile 准备离开(见下文)并释放等待的 (n-1) 个线程(在第 10 行等待)。然后每个信号都向下一个发出信号。

第二个互斥锁的工作方式与第一个类似,但递减count(相同的互斥体可以保护它)。最后进入互斥锁的线程turnstile准备下一批进入(见上文)并释放第 22 行等待的 (n-1) 个线程。然后每个线程向下一个线程发出信号。

Thus turnstile协调进入临界点的条目,同时turnstile2协调从中退出。

不可能出现死锁:当(最后一个)线程到达第 18 行时,turnstile保证不被任何其他线程持有(它们都在第 22 行等待)。类似地与turnstile2

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

可重复使用的Barrier解决方案陷入僵局? 的相关文章

  • 当将信号量递减至零的进程崩溃时,如何恢复信号量?

    我有多个使用 g 编译的应用程序 在 Ubuntu 中运行 我使用命名信号量来协调不同的进程 一切正常except在以下情况下 如果其中一个进程调用sem wait or sem timedwait 减少信号量 然后在有机会调用之前崩溃或被
  • SQL Server 在同一个表上发生死锁

    我们的应用程序中存在死锁情况的问题 在过去的几天里 我阅读了很多有关阻塞 锁定和死锁的内容 试图了解问题并解决问题 现在 当我阅读有关死锁的错误日志信息时 我无法理解这种情况是如何存在的 看看这个 我已经重命名了表名 但重要的是日志消息中名
  • TPL 数据流与普通信号量

    我需要制定一个可扩展的流程 该进程主要有 I O 操作和一些次要的 CPU 操作 主要是反序列化字符串 该流程在数据库中查询 url 列表 然后从这些 url 中获取数据 将下载的数据反序列化为对象 然后将部分数据保存到 crm 动态以及另
  • WCF 客户端由于回调而死锁,即使回调 IsOneWay 也是如此

    WCF 新手 我有一个客户端在调用 WCF 服务时陷入死锁 该服务将在调用时调用对客户端的回调 该回调被标记为 IsOneWay 我已确认该服务不会阻塞回调 然后 客户端立即再次调用相同的服务 在紧密循环中 而无需为回调提供服务 然后客户端
  • WinDbg——TraceListener 和饱和线程池

    我有一个多线程 NET Windows 服务 它间歇性地挂起 可能每两周 24 7 运行一次 当发生挂起时 线程池完全饱和 因为对我们的自定义跟踪侦听器的调用由于某种原因开始阻塞 根据 Windbg 的说法 有问题的代码中没有任何锁 也没有
  • 检查 pthread 互斥体是否被锁定或解锁(线程锁定自身之后)

    我需要查看 if 语句中互斥体是否被锁定或解锁 所以我像这样检查 if mutex id 2 do stuff 但是当我检查 gcc 时 出现以下错误 error invalid operands to binary have pthera
  • 使用信号量实现 N 进程屏障

    我目前正在为之前迭代的操作系统考试进行培训 我遇到了这个 实施 N 进程屏障 即 是 确保每个流程都完成 他们中的一群人在某个时刻等待着 点在其各自的执行中 对于 其他进程达到他们的 给定点 您有以下内容 可用操作 init sem val
  • 如何重用/重置 ZipInputStream?

    我想重置 ZipInputStream 即回到起始位置 以便按顺序读取某些文件 我怎么做 我好卡住 ZipEntry entry ZipInputStream input new ZipInputStream fileStream item
  • 用餐哲学家挨饿的可能性

    我需要检查解决哲学家就餐问题的算法是否保证满足以下所有条件 不存在僵局的可能性 没有挨饿的可能 我正在使用信号 http en wikipedia org wiki Semaphore 28programming 29放在筷子上即可解决问题
  • 信号量和互斥量在实现上有什么区别?

    我读到互斥锁和二进制信号量仅在一方面不同 在互斥锁的情况下 锁定线程必须解锁 但在信号量中 锁定和解锁线程可以不同吗 哪一种效率更高 假设您知道信号量和互斥体之间的基本区别 为了快速 简单的同步 请使用临界区 要跨进程边界同步线程 请使用互
  • 零 SQL 死锁设计 - 有编码模式吗?

    我在 MS SQL Server 2005 之上运行的 NET 2 0 Web 应用程序上遇到了非常罕见但烦人的 SQL 死锁 过去 我们一直以非常经验的方式处理 SQL 死锁 基本上是调整查询直到它起作用 然而 我发现这种方法非常不令人满
  • SQL Server 的 SELECT JOIN 语句导致的死锁

    当执行带有两个表的 JOIN 的 SELECT 语句时 SQL Server 似乎 分别锁定语句的两个表 例如通过像这样的查询 这 SELECT FROM table1 LEFT JOIN table2 ON table1 id table
  • UI线程块

    我创建了一个简单的 WPF 应用程序 并向默认窗口添加了一个按钮 当我单击按钮时 会调用一个模拟的长工作方法 使用 Thread Sleep 15000 进行模拟 我试图使按钮异步执行 但是尽管遵循在线示例 按钮和整个窗口都会在我锁定时立即
  • 查找mysql死锁原因

    1 我有一个脚本 执行一些更新 删除操作 2 所有sql操作都在事务内执行 InnoDb表 3 有时我会收到 尝试获取锁定时发现死锁 尝试重新启动事务 该应用程序中还有一些其他作业执行数据库操作 我的问题是找出其他脚本中的哪些并发查询会干扰
  • 将 collections.namedtuple 与 ProcessPoolExecutor 一起使用在某些情况下会陷入困境

    gt gt gt import concurrent futures gt gt gt from collections import namedtuple gt gt gt 1 Initialise namedtuple here gt
  • ASP.NET Core Web API 应用程序是否可能出现死锁或应用程序挂起状态

    我有一个 ASP NET Core 3 1 Web API 应用程序 它有一个后台主机服务 我在其中编写了以下代码来模拟应用程序的死锁 public class Worker IHostedService public Task Start
  • 我需要处置 SemaphoreSlim 吗?

    根据文档 a SemaphoreSlim不使用 Windows 内核信号量 是否有任何特殊资源被使用SemaphoreSlim这使得打电话很重要Dispose当 的时候SemaphoreSlim将不再使用 如果您访问AvailableWai
  • 如何跨多个域重用代码?

    我只是使用 Yii 框架构建了一个 CMS 框架 我想将 CMS 部署到多个域 home root www domain1 com home root www domain2 com home root www domain3 com ho
  • SQL Server 2008:在没有任何锁的情况下出现死锁

    我目前正在 SQL Server 2008 数据库上进行一些实验 更具体地说 我有一个 JDBC 应用程序 它使用数百个并发线程来执行数千个任务 每个任务都在数据库上运行以下查询 UPDATE from Table A where rowI
  • 如何避免MySQL'尝试获取锁时发现死锁;尝试重新启动交易'

    我有一个innoDB表 记录在线用户 它会在用户每次刷新页面时进行更新 以跟踪他们所在的页面以及他们上次访问该网站的日期 然后我有一个每 15 分钟运行一次的 cron 来删除旧记录 我收到 尝试获取锁定时发现死锁 昨晚尝试重新启动事务大约

随机推荐

  • 如何将异步(非阻塞)javascript 与 DNN 客户端资源管理结合使用

    我使用 DNN 的客户端资源管理将 javascript 和 css 加载到主题 皮肤 中 这样我就可以利用缩小和复合文件 但我需要它们是异步的 非阻塞 如何才能做到这一点 So far as I know there is not a w
  • 如何在 swift 中过滤具有其他数组值的结构数组?

    我已经搜索过这个问题 但没有找到任何适合我使用最新版本的 Xcode 和 Swift 的解决方案 我使用三个数组 1 baseArray Meal array filled with every meal Not locally saved
  • Swift & Parse - PFUser currentUser 永远不等于 nil

    我正在使用 Xcode Swift 和 Parse 当我尝试注销 PFUser 时 我从未得到 nil 返回 在应用程序的这一部分中 viewController 只是显示一些登录按钮 其中一个按钮让用户进行注册 一种是发送用户更改详细信息
  • 如何计算两个相机之间的旋转和平移?

    我知道棋盘相机校准技术 并且已经实现了 如果我有两个摄像机观看同一场景 并且我使用棋盘技术同时校准两个摄像机 我可以计算它们之间的旋转矩阵和平移向量吗 如何 如果您有对应点的 3D 相机坐标 则可以通过以下方式计算最佳旋转矩阵和平移向量刚体
  • Android 自定义 XML 文件的放置

    我有一个很大的 XML 文件 其排列方式如下
  • 如何更改 PHP 常量? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在用 PHP 手工制作我自己的自定义 CMS 并且我已经定义了一些常量 有没有简单的方法来修改常量 我正在考虑使用类似的东西fop
  • 为什么找不到静态库头?

    我用过克林特 哈里斯的教程 http www clintharris net 2009 iphone app shared libraries 在项目之间设置代码共享 一切都在我的计算机上按预期运行 但是在我同事的机器上 编译器在构建时似乎
  • 播放声音有一点延迟

    我的应用程序中有一个声音 当出现视图时会自动启动 但是 正如标题所说 我希望声音开始时有一点延迟 大约在视图出现后半秒 我尝试使用 PlayAtTime 但是它不起作用或者我设置了错误 这是我的代码 var player AVAudioPl
  • React-Navigation 3:使用 createBottomTabNavigator 和 createStackNavigator 打开模式

    我知道这个问题以前曾被问过 但仅限于旧版本的反应导航 从那时起 一些事情发生了变化 createBottomTabNavigator可以更快地创建底部导航器和功能jumpToIndex 不存在了 我的问题是如何创建一个类似 Instagra
  • 根据一列删除重复项并在 Google 表格中保留最新条目

    我正在研究一些自动化 并希望通过根据第三列进行比较来删除我的谷歌工作表中的重复行 我发现一个代码可以完美运行 但它不会删除工作表中的旧条目 而是删除最新的条目 我想保留最新的而不是重复的 这是我为 appscript 找到的代码Cooper
  • Python - 如何使该代码异步?

    这是一些说明我的问题的代码 def blocking1 while True yield first blocking function example def blocking2 while True yield second block
  • SmartGWT ListGrid 很慢,但仅限于 Internet Explorer

    我们已经从 gwtext 迁移到 SmartGWT 总体体验还不错 然而 我们在使用 SmartGWT 的 ListGrid 组件时遇到了很大的问题 如果满足以下两个条件 则速度非常慢 使用 Internet Explorer 5 列或更多
  • 如何在 Django 模型中存储字符串数组?

    我正在构建一个 Django 数据模型 并且希望能够在其中一个变量中存储一组字符串 我怎样才能做到这一点 e g class myClass models Model title models CharField max length 50
  • 将 BLOB(图像)从 oracle 导入到 hive

    我正在尝试使用下面的 Sqoop 命令将 BLOB Image 数据从 oracle 导入到 Hive sqoop import connect jdbc oracle thin host username password m 3 tab
  • 使用 Fusion Table 时有哪些技术限制?

    我正在寻找有关使用 Fusion Tables 时的技术限制的信息 Fusion Table 中可以存储多少行 可以针对 Fusion Table 同时运行多少个查询 读 写 我找不到任何信息https developers google
  • 在 HTML 末尾或“onload”时初始化 JS 组件?

    有一段时间 我一直在通过等待 onload 事件触发并执行一个 JavaScript 组件初始化来运行main 各种各样的 它看起来更干净 并且您可以确定 DOM 的 ID 状态是有序的 但经过一段时间的测试后 我发现组件的初始化被加载期间
  • 编码为 JSON 时 Golang 错误类型为空

    我正在尝试为 REST api 编码一些 JSON 除了一些错误之外 一切正常 例如 使用以下结构 type TemplateResponse struct Message string Error error Template Templ
  • R -应用-将许多列从数字转换为因子

    我需要将许多数字列转换为因子类型 示例表 df lt data frame A 1 10 B 2 11 C 3 12 我尝试过应用 cols lt c A B df cols lt apply df cols 2 function x as
  • WP7 Bing 地图图钉 - 如何调整自定义图钉的位置?

    好吧 简单的问题 但我还没有找到明显简单的答案 我有一个带有地图集成的 Windows Phone 7 应用程序 地图上有一组图钉 图钉是定制的 只是椭圆形 圆形 不幸的是 自定义图钉的位置与地理位置 偏离 当你放大时 它会越来越接近准确
  • 可重复使用的Barrier解决方案陷入僵局?

    我一直在读 The Little Book of Semaphores 第 41 页有一个针对可重用屏障问题的解决方案 我遇到的问题是为什么它不会产生死锁情况 1 rendezvous 2 3 mutex wait 4 count 1 5