boost 线程中的虚假解锁

2024-01-07

我在提升线程文档 http://www.boost.org/doc/libs/1_38_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref today:

void wait(boost::unique_lock<boost::mutex>& lock)

...

效果:原子调用lock.unlock() 并阻塞当前线程。这 线程将在收到通知时解除阻塞 调用 this->notify_one() 或 this->notify_all(),或者虚假地。 当线程被解除阻塞时(对于 无论什么原因),锁是 通过调用lock.lock()重新获取 在 wait 调用返回之前。这 锁也可以通过调用重新获取 lock.lock() 如果函数退出 一个例外。

所以我感兴趣的是“虚假”这个词的含义。为什么线程会因虚假原因而被解除阻塞?可以采取什么措施来解决这个问题?


本文作者:安东尼·威廉姆斯 http://www.justsoftwaresolutions.co.uk/threading/condition-variable-spurious-wakes.html写得特别详细。

无法预测虚假唤醒: 它们本质上是随机的 用户的观点。然而,他们 通常发生在线程库 不能可靠地确保等待 线程不会错过任何通知。 由于错过通知会 使条件变量无用, 线程库唤醒线程 从它的等待而不是采取 风险。

他还指出你不应该使用timed_wait需要一段时间的重载,通常应该使用带有谓词的版本

这是初学者的错误,其中之一 这很容易用一个简单的方法克服 规则:总是检查你的谓词 等待条件时循环 多变的。更阴险的bug来了 来自 timed_wait()。

本文作者:弗拉基米尔·普鲁斯 http://vladimir_prus.blogspot.com/2005/07/spurious-wakeups.html也很有趣。

但为什么我们需要 while 循环, 我们不能写:

if (!something_happened)
  c.wait(m);

我们不能。致命的原因是“等待”可以 返回没有任何“通知”调用。 这就是所谓的虚假唤醒 POSIX 明确允许。 本质上,仅从“等待”返回 表明共享数据可能 已更改,因此数据必须 再次评价。

好吧,那为什么这个问题还没有解决呢? 第一个原因是没人愿意 要解决这个问题。将呼叫包装为“等待” 一个循环对于几个人来说是非常需要的 其他原因。但那些原因 需要解释,虽然是虚假的 唤醒是一个可以应用的锤子 任何一年级学生没有 失败。

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

boost 线程中的虚假解锁 的相关文章

  • 为什么绿色线程不能在多核上工作

    在维基百科上 绿色线程 http en wikipedia org wiki Green threads被描述为通常无法在多核上运行 而没有解释原因 在多核处理器上 本机线程实现可以 自动将工作分配给多个处理器 而绿色线程 实现通常不能 我
  • 如何通过之前编写的预处理器定义获取函数签名?

    我想创建一个定义来解析函数签名并使用 Boost Preprocessor 创建如下内容 MY DEFINE std string fun int t float b 或者至少 MY DEFINE std string fun int t
  • 在库的公共接口中使用 boost::shared_ptr

    我们有一个 C 库 提供给多个不同的客户 最近 我们从在公共接口中使用原始指针改为使用 boost sharedptr 正如您可能猜到的那样 这提供了巨大的好处 因为现在客户不再需要担心谁需要删除什么以及何时删除 当我们进行切换时 我相信这
  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 缓冲后台输入流实现

    我已经写了背景InputStream and OutputStream 包装其他流并在后台线程上预读的实现 主要允许在处理解压缩流的不同线程中进行解压缩 压缩 这是一个相当标准的生产者 消费者模型 这似乎是一种利用多核 CPU 的简单方法
  • 优化计算中使用的 # 个线程的算法

    我正在执行一个操作 我们将其称为CalculateSomeData CalculateSomeData 在连续的 代 中运行 编号为 1 x 整个运行中的代数由CalculateSomeData 的输入参数固定 并且是先验已知的 完成一次生
  • 进度条没有进展

    我有一个正在更新 sqlserver 中的表的程序 我有一个表单 我想显示其进度 进度条正在递增 但没有显示 我需要为此使用后台工作者吗 我正在做什么的例子 public void updateTable string tableName
  • 无锁算法真的比全锁算法性能更好吗?

    陈雷蒙德 http blogs msdn com b oldnewthing 一直在做一个huge http blogs msdn com b oldnewthing archive 2011 04 15 10154245 aspx ser
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 向无锁队列添加阻塞函数

    我有一个基于循环缓冲区的无锁多生产者 单消费者队列 到目前为止 它只有非阻塞push back and pop front 来电 现在我想添加这些调用的阻塞版本 但我想尽量减少这对使用非阻塞版本的代码性能的影响 也就是说 它不应该将它们变成
  • FileSystemWatcher 在队列中丢失文件

    我写了一个FileSystemWatcher为每个文件调用一次 pgm 但我的一些文件丢失了 我只用 10 11 个文件测试了代码 文件的删除会被正确记录 但创建不会被正确记录 某些文件未记录 我的 TASK 实施可能存在问题吗 或者有什么
  • Shared_ptr 在哪里?

    经过几个小时试图找到shared ptr 所在的位置后 我现在非常沮丧 我看到的示例都没有显示包含标头的完整代码shared ptr 和工作 简单说明一下std tr1 and
  • 为并行的小型已知冻结进程创建匿名 AsyncTask 是一个好习惯吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 例如 您要做一些需要几秒钟的事情 并且不想冻结您的 UI 线程 对吗 您可以使用 AsyncTask 但您不想创建外部 或内部 类来解决小冻结问
  • 使用迭代器遍历 boost::ublas 矩阵

    我只是想从头到尾遍历一个矩阵 触及每个元素 然而 我发现升压矩阵没有一个迭代器 而是有两个迭代器 而且我无法弄清楚如何使它们工作以便您可以遍历整个矩阵 typedef boost numeric ublas matrix
  • 寻找自定义 SynchronizationContext 的示例(单元测试所需)

    我需要定制同步上下文 http msdn microsoft com en us library system threading synchronizationcontext aspx that 拥有一个运行 Posts 和 Sends
  • 如何让 PowerShell 等待 Invoke-Item 完成?

    如何让 PowerShell 等待 Invoke Item 调用完成 我正在调用一个不可执行的项目 因此我需要使用 Invoke Item 来打开它 只需使用Start Process wait 例如Start Process wait c
  • 以线程安全的方式获取随机数

    这是一篇描述随机数线程安全性的好文章 以线程安全的方式获取随机数 http blogs msdn com b pfxteam archive 2009 02 19 9434171 aspx 但我坚持使用 RandomGen2 示例 publ
  • 在 std::thread 创建的线程中调用 pthread_sigmask 是一个好习惯吗?

    1 我是 std thread 的新手 我想知道调用是否是一个好的做法pthread sigmask 阻止某些信号特别的线程创建者std thread 我不希望新线程接收SIGTERM SIGHUP等信号 因为主进程已经安装了这些信号的处理
  • 如何在其他核心上运行每个线程?

    我有一个 udp 服务器接收数据并计算它 每个角色我都有两个线程 我的CPU是8个多核 我以不同的速度发送数据 但最多我只使用了 cpu 两核 50 的 14 如果我发送更多的数据值 我的缓冲区将填满并且不会使用更多的CPU 为什么每个核心
  • 使用 AJAX 或多线程加速页面加载

    我的页面有 5 个部分 每个部分大约需要 1 秒来渲染 Page Load RenderSection1 1 sec RenderSection2 1 sec RenderSection3 1 sec RenderSection4 1 se

随机推荐

  • 使用终端和 MacFusion 时出现 GIT_DISCOVERY_ACROSS_FILESYSTEM 问题

    我使用 MacFusion 和 OSXFuse 类似于 MacFuse 通过 SSH 将我的服务器安装到我的办公室计算机上 当我 cd 进入服务器上的 Rails 工作目录时 我在 zsh 提示符中看不到任何 git 信息 如果我尝试 gi
  • Android 中的 HTTP 客户端 API 级别 11 或更高级别

    我有 Jersey 实现的 Restful Web 服务 我通过 HTTP 客户端从 Android 进行连接以获取数据 它在 API 级别 10 及更早版本中工作正常 但在 API 级别 11 或更高版本上则不行 我很感激任何帮助 我在这
  • 按元素上的条件值对 numpy 数组元素进行排序

    我需要通过增加与另一个点的距离来对点的 numpy 数组进行排序 import numpy as np def dist i j ip jp return np sqrt i ip 2 j jp 2 arr np array 0 0 1 2
  • @Valid 注释在应用于 MultipartFile 对象时会被忽略

    这是我的控制器 它接受一个multipart form data有两个字段的请求 form and file The form字段是一个MyObject the file字段是一个MultipartFile 两个变量都注释为 Valid 因
  • 自定义商店页面产品以直接进入联属网站

    我需要在 WooCommerce 上使用什么 这样当您在商店 目录页面上看到产品时 它会直接链接到联属网站 而不是通过单个产品页面 然后 如果可能的话 在新选项卡中打开它 Thanks 更新 添加了 WC 3 兼容性 对于您的情况 您需要自
  • DDD,反腐败层,如何做?

    目前 我们必须构建一个基于遗留应用程序的应用程序 旧应用程序的代码应该被丢弃并重写 但正如通常情况一样 我们需要在其基础上创建新的东西 而不是重写它 最近 我们决定走领域驱动设计之路 因此 反腐败层可以解决我们的问题 据我了解 这样应该可以
  • 如何在 Tornado 中将异步函数和 gen 函数包装在一起?

    如何在 Tornado 中将异步函数和 gen 函数包装在一起 我的代码如下所示 错误是 Future 对象没有属性 body 我是否以错误的方式放置了装饰器 import tornado httpclient import tornado
  • 如何使这种排序不区分大小写?

    def sortProfiles p return sorted p key itemgetter first name 我有一个带有字典的列表 这个函数允许我按他们的名字对他们进行排序 但是 它区分大小写 gt gt gt from op
  • 甲骨文银行家规则

    为什么 Oracle 不使用银行家统治 http en wikipedia org wiki Rounding Round half to even 舍入方法 精确的十进制算术是一个庞大而复杂的课题 如果你想阅读关于这个主题的 ahem O
  • 默认模板参数和部分特化

    请向我解释为什么下面的代码符合并完美运行 我很困扰 include
  • javascript 将事件绑定到类名的更改

    javascript jQuery 是否可以将函数绑定到 DOM 元素的类名更改或分配新类 不 更新类时不会触发广泛支持的事件 你必须进行民意调查 部分浏览器支持DOM 突变事件 http www w3 org TR DOM Level 3
  • Laravel 5.3 中的路由保护问题

    我在 Laravel 中创建了一个登录 注册页面 它工作正常 但我想通过允许经过身份验证的用户单独访问 URL 来保护路由 这是我的 web php Route get uses gt UserController getLogin as
  • 如何修改 Swing 在布局文本组件时使用的剪辑字符串省略号

    默认情况下 Swing 使用省略号 来指示 JLabel 和类似的基于文本的组件中的文本已被截断 是否可以更改此行为以使用不同的字符串 例如 gt 通过查看 Swing 代码 我在 SwingUtilities2 中发现了一个名为 Clip
  • Angular-ui-router 打字稿定义

    当我们更新应用程序以使用 angular ui router v1 0 3 时 我们在打字稿定义方面遇到了一些问题 由于我们使用 stateChangeSuccess 事件 迁移指南告诉我们现在应该使用 TransitionService
  • 以幂形式表示的整数

    一个号码N据说可以用幂形式表达 如果对于某些a gt 0还有一些x gt 1 我们有N a x 现在为了检查这一点 我们可以取两边的对数 方程变为log n log a x所以通过迭代 2 sqrt n 如果存在任何给出的数字x作为该数的幂
  • 如何在 Gitlab 中成功管道的末尾创建合并请求?

    我对 gitlab 和 gitlab CI 非常陌生 我已经建立了一个正在成功完成的管道 我的主分支和开发分支受到保护 因此需要合并请求 以便组中的另一个开发人员可以在合并之前查看代码和评论 我想知道是否可以在此管道的末尾生成此合并请求 g
  • 从过程中调用带有表参数的函数时出现编译错误

    在一个包中 我有 一种数字表 以所述数字表类型作为参数的函数 需要使用数字表类型调用所述函数的过程 我知道类型有效 我知道功能有效 但是当我尝试在过程中调用函数时 出现以下编译错误 错误 262 16 PLS 00306 调用中参数的数量或
  • 如何使用持久连接在 AWS 中处理 PDO MySQL 故障转移

    我们遇到了 AWS Aurora 故障转移问题 正在寻找解决方法 Scenario AWS Aurora 设置有两个端点 Writer 主机 stackName dbcluster ID cluster ID us west 2 rds a
  • 正确指定“逻辑条件”(在 R 中)

    我正在使用 R 编程语言 我正在尝试遵循此 stackoverflow 帖子中的答案 将 R 中的参数传递给多个实数变量的函数 https stackoverflow com questions 56359838 argument pass
  • boost 线程中的虚假解锁

    我在提升线程文档 http www boost org doc libs 1 38 0 doc html thread synchronization html thread synchronization condvar ref toda