饥饿与upgrade_lock

2024-03-26

我正在尝试使用Boostupgrade_lock (using 这个例子 https://stackoverflow.com/questions/989795/example-for-boost-shared-mutex-multiple-reads-one-write,但我遇到了饥饿问题。

我实际上正在使用来自的代码这个帖子 https://stackoverflow.com/questions/12082405/boost-shared-lock-read-preferred/13445989#13445989,但我想要最新的讨论。我在之后运行了 400 个线程工人杀手。我遇到了完全相同的问题匿名者,上述帖子的作者。

我已经看到了来自霍华德·希南特,但我真的不想包含更多的外部代码(而且我现在无法编译他的代码),并且 6 个月后发布的评论指出“Boost 现在使用公平的实现“(2012 年 12 月 3 日)。

The Boost 1.55 文档 http://www.boost.org/doc/libs/1_55_0/doc/html/thread/synchronization.html指出:

Note the the lack of reader-writer priority policies in shared_mutex. This is 
due to an algorithm credited to Alexander Terekhov which lets the OS decide 
which thread is the next to get the lock without caring whether a unique lock or 
shared lock is being sought. This results in a complete lack of reader or writer
starvation. It is simply fair.". 

该算法归功于亚历山大·捷列霍夫是那个霍华德·希南特谈到,所以我希望 1.55 boost 实现的行为就像 Howard Hinnant 的答案一样,但事实并非如此。它的行为与问题中的完全一样。

为什么我的情况是这样工人杀手挨饿吗?

更新:观察到这段代码 https://gist.github.com/anonymous/bd3440d438da82061f22 on:

  • Debian x64,Boost 1.55(Debian 版本和从源代码编译的版本),带有 clang++ 和 g++
  • Ubuntu x64,Boost 1.54,带有 clang++ (3.4-1ubuntu1) 和 g++ (4.8.1-10ubuntu9)

这是一个微妙的问题。差异涉及共享和可升级所有权的概念及其在 Boost 中的实现。

让我们首先理清共享所有权和可升级所有权的概念。 为一个共享可锁定 http://www.boost.org/doc/libs/1_55_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_concepts.shared_lockable,线程必须事先决定是否要更改对象(需要独占所有权)或仅读取对象(共享所有权就足够了)。如果具有共享所有权的线程决定要更改该对象,则它首先必须释放该对象上的共享锁,然后构造一个新的排它锁。在这两个步骤之间,线程根本不持有对象的锁。尝试从已持有共享锁的线程构造排它锁将会死锁,因为排它锁构造函数将阻塞,直到所有共享锁被释放。

升级可锁定 http://www.boost.org/doc/libs/1_55_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable通过允许将共享锁升级为排它锁来克服此限制不释放它。也就是说,该线程始终保持互斥体上的活动锁,同时禁止其他线程获得排它锁。除此之外,UpgradeLockable 仍然允许来自 SharedLockable 的所有操作,前一个概念是后者的超集。这您链接到的问题 https://stackoverflow.com/questions/12082405/boost-shared-lock-read-preferred/13445989#13445989只关心 SharedLockable 概念。

正如 Boost 所指定的,这两个概念都不需要公平的实现。但是,那shared_mutex http://www.boost.org/doc/libs/1_55_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types.shared_mutex,这是 Boost 对 SharedLockable 的最小实现,确实提供了您问题中引用的公平性保证。请注意,这是一个额外保证到这个概念的实际需要。

不幸的是,可升级所有权的最低实现,upgrade_mutex http://www.boost.org/doc/libs/1_55_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types.upgrade_mutex,不提供这种额外的保证。它仍然实现共享所有权概念作为可升级所有权的要求,但由于一致性实现不需要公平,因此他们不提供它。

As 霍华德在评论中指出 https://stackoverflow.com/questions/21773618/starvation-with-upgrade-lock/21778949?noredirect=1#comment45138062_21778949,Terekhov 的算法也可以进行简单的调整以使用可升级的锁,只是 Boost 实现目前不支持这一点。

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

饥饿与upgrade_lock 的相关文章

  • 如何从 NSOperationQueue 中删除/取消 NSInitationOperation?

    以下两个问题都是在维护 NSOperationQueue 和 NSInvocableOperation 的上下文中提出的 由于我已经使用这个概念来下载多个视频 因此在下载视频完成后 如何从 NSOperationQueue 中删除 释放添加
  • 如何使用 Python 从 Azure Functions 中的辅助线程重定向日志

    我正在使用 Azure 函数运行启动多个线程的 Python 脚本 出于性能原因 一切都按预期工作 但 Azure Functions 日志中仅显示来自 main 线程的信息日志 我在 main 中启动的 辅助 线程中使用的所有日志都不会出
  • 在多个不同线程之间共享变量

    我想在多个线程之间共享一个变量 如下所示 boolean flag true T1 main new T1 T2 help new T2 main start help start 我想分享flag在主线程和帮助线程之间 这是我创建的两个不
  • 双重检查锁定模式

    In 有伪代码来正确实现作者建议的模式 见下文 Singleton Singleton instance Singleton tmp pInstance insert memory barrier 1 if tmp 0 Lock lock
  • 如何管理循环器和线程(线程不再消亡!)

    我创建了一个扩展 Thread 的类 以通过非 ui 线程中的 LocationManager 检索用户位置 我将其实现为一个线程 因为它必须根据请求启动并仅在有限的时间内完成其工作 顺便说一句 我必须在线程中添加一个 Looper 对象
  • 提高批量请求的野兽内存使用率

    我运行这个boost beast 客户端 异步 ssl http www boost org doc libs develop libs beast example http client async ssl http client asy
  • Lockfree 标准集合和教程或文章

    有人知道用于无锁常用数据类型的实现 即源代码 的好资源吗 我正在考虑列表 队列等 锁定实现非常容易找到 但我找不到无锁算法的示例以及 CAS 的工作原理以及如何使用它来实现这些结构 查看 Julian M Bucknall 的博客 他 详细
  • 模拟后 CreateMutex 失败

    这是我尝试模拟用户然后创建互斥体的代码 未创建互斥体 我收到 ERROR ACCESS DENIED 错误 void Impersonate DWORD logonType LOGON32 LOGON INTERACTIVE DWORD l
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • 没有公平性的DelayQueue有问题吗?

    在 Java 7 中 DelayQueue 的实现使用没有公平策略的 ReentrantLock 从长远来看 这是一个问题吗 线程会因此而饿死吗 Thanks 如果您考虑ScheduledThreadPoolExecutor 或任何其他生产
  • 使用 Boost program_options 指定级别(例如 --verbose)

    我的一些选择有多个级别 例如的 冗长 我希望我的用户在以下两种等效样式之间进行选择 no argument verbosity of 1 my program v count the v s verbosity of 4 my progra
  • 安装 ROS 时 Cmake 未检测到 boost-python

    我一直在尝试在我的 Mac 上安装 ROS 并根据不同版本的 boost 使用不同的库解决了错误 然而 似乎有一个库甚至没有检测到 boost python 这是我得到的错误 CMake Error at usr local share c
  • 块执行后变量返回 null

    我正在调度一个队列来在单独的线程上下载一些 flickr 照片 在 viewWillAppear 中 当我记录块内数组的内容时 它完美地显示了所有内容 dispatch queue t photoDowonload dispatch que
  • 判断线程是否已经启动

    如何判断Python线程是否已经启动 有一个方法is alive 但这是真的before and while一个线程正在运行 你可以看看ident领域的Thread实例 这Python 2 7 线程文档 http docs python o
  • 使用 C# 的异步 WebRequest

    您好 我有一个函数 它将 url Get 参数传递到网络服务器上的 php 文件 并等待文件的响应 通常需要 10 20 秒 我想将其放入一个循环中 因为我必须一次将这些 Get 请求发送到大约 5 个不同的 php 文件 但是当我尝试将其
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • 当应用程序终止时,我可以安全地依赖 Threads 中的 IsBackground 吗?

    我正在 GUI 中运行一些后台线程 目前 我正在实现个人线程取消代码 但线程中有 IsBackground 属性 根据 MSDN 它们会自行取消 我知道它将进入 Thread Abort 这很令人讨厌 但是在这个后台线程中没有任何事情需要我
  • 低级键盘钩子不在 UI 线程上

    我想为键盘挂钩创建一个好的库 我使用 SetWindowsHookEx 方法 我注意到如果我的应用程序的主线程繁忙 则应在任何系统 KeyDown 事件中调用的方法 hookProc 不会执行 我认为钩子应该这样制作 以便另一个线程负责它
  • 如何为 Visual Studio 代码设置 boost

    所以我基本上构建了整个boost库并将它们放在C boost include boost 1 73中 但我有一种感觉 在使用这个库之前我必须包含更多步骤 我一直遵循本指南 直到将其设置为 Visual Studio 代码 所以现在我正在互联
  • 如何从不同的线程访问控件?

    如何从创建控件的线程以外的线程访问控件 避免跨线程错误 这是我的示例代码 private void Form1 Load object sender EventArgs e Thread t new Thread foo t Start p

随机推荐

  • 设备无法识别 USB 调试上的 AVD 设备

    我的公司推出了由中国公司制造的新Android学习选项卡 我在此选项卡上测试我的应用程序时遇到问题 我可以使用驱动程序升级选项卡的操作系统 但我无法将设备用作 AVD 我从开发者选项中打开了 USB 调试 升级操作系统的驱动程序和将设备用作
  • 如何对调用 getJSON 的 javascript 函数进行单元测试

    我已经在单元测试中苦苦挣扎了两天 但在异步测试方面我无法实现一些目标 我是单元测试的新手 我不明白为什么这不起作用 我有一个文件 login js 调用 getJSON url data function 并返回一个带有登录状态的字符串 成
  • Android OnClickListener 未在 GridView 中触发(仅限 2.2)

    我有一个由 CursorAdapter 生成的按钮网格视图 当 CursorAdapter 传递到 Gridview 时 视图会正确呈现 但网格中的第一个项目不会触发 OnClickListener 事件 如果我在网格中选择另一个按钮 该事
  • 使用java代码获取FXML文件节点

    如何使用 FXML 文件获取元素或节点Java 我知道使用方法初始化或通过设置控制器FxmL 中的类 但我需要在没有任何控制器的情况下完成它 我想使用访问 fxml 文件内的节点 我的 FXML 代码 HBox fx id hbx id h
  • 如何知道基类指针指向什么类型的对象?

    我有一个名为 Cell 的基类 其他类有一个指向该类的对象的指针 以及 3 个派生类 CellA CellB 和 CellC 当一个 Cell 死亡时 指针指向 Cell 否则是存活的 A B 或 C 如何知道此时此刻指针指向什么而采取行动
  • 在按钮上绘制文本 - 外观差异

    I have my custom button where I have overridden the OnPaint and draw the text in it only On runtime the text looks diffe
  • 尝试修复 NetworkOnMainThreadException 但出现 Toast 错误

    我正在尝试修复来自 java 代码极客的我最喜欢的示例之一的线程错误 这是代码 public class JsonParsingActivity extends Activity String url http search twitter
  • @include 容器是什么意思?

    我正在开始使用 Compass 和 Susy 我的目标是让我的布局适应手机 平板电脑和桌面屏幕尺寸 在 Susy 的例子中 susy oddbird net http susy oddbird net guides reference re
  • Linux(或 RedHat Linux)上的小块分配器以避免内存碎片

    我知道有一个用于用户应用程序的分配器 可以处理 HP UX 上的大量小块分配链接文本 http docs hp com en B9106 90010 malloc 3C html在 Windows XP 上低碎片堆 http msdn mi
  • C# - 如何从集合视图中获取不同的项目

    CollectionView view CollectionView CollectionViewSource GetDefaultView MyData View Filter i gt MyClass i MyProperty 我有一个
  • iOS:UDID 已弃用...MAC 地址?

    据我们所知 Apple 不赞成开发者访问 UDID 但据我所知 可以获得 iDevice 的 MAC 地址 那么有什么区别呢 MAC地址和UDID都是硬件的唯一标识符 与应用程序无关 UDID 和 MAC 地址之间的一些明显差异 可以想象
  • Emacs 读取大文件 ~14GB [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 最近我在我的系统上下载了 emacs 来编辑大文件 正如它声称的那样 当尝试打开大文件时 emacs 给我带来了缓冲区大小超出的问题 有办法增加吗 我
  • 使用Android模拟器进行远程调试

    是否可以在一台机器上编写代码 编译 Android 应用程序并在另一台机器上启动的模拟器上远程调试它 我厌倦了模拟器不断地占用我笔记本电脑一半的 CPU 我以前没有尝试过 甚至没有注意到 adb connectcmb 提到的命令 但我可以确
  • 修复了 IOS 上位置延迟的问题

    当我在 iPad 上测试了我的网站上的 affix 后 我发现它无法正常工作 我惊讶地发现这是 iOS 的问题https github com twbs bootstrap issues 11560 https github com twb
  • Android 中的 ImageView 内容是否有工具属性?

    我找不到tools属性以在 Android 布局中设置示例图像 我的假设是目前没有这样的事情 至少没有direct支持 但我想知道是否我搜索得不够好或者是否有解决方法 如何在 Android 设计时定义图像占位符tools 的例子tools
  • 使用 barsince(change(strategy.position_size)) > 10 时输入不起作用

    我的脚本中有一个奇怪的问题 这是工作代码 version 4 strategy Test script overlay true pyramiding 100 process orders on close true FACTOR 1X M
  • 使用 jQuery 检索和修改 :before 元素

    我想选择一个由 CSS 选择器创建的元素 before 我尝试使用 element before 但这不起作用 因为它选择了整个元素 而不仅仅是 before元素 这是示例代码 DEMO http jsfiddle net qGStB 在该
  • 无法在 Mac 上的 Genymotion 模拟器上运行 telnet 命令

    我在 Mac OS X Yosemite 上运行 Genymotion 2 3 1 当我在 Win 7 上运行 Genymotion 时 我可以远程登录到模拟器并运行 geo fix 等命令来设置位置 但是 在 Yosemite 上 当我远
  • 在 Excel 中单击时,超链接从 # 更改为 %20-%20 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Excel 2013 工作表中有一个链接到内部网站的超链接 当我右键单击并选择 编辑超链接 时 我在地址栏中看到以下内容 这是正确的
  • 饥饿与upgrade_lock

    我正在尝试使用Boostupgrade lock using 这个例子 https stackoverflow com questions 989795 example for boost shared mutex multiple rea