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 线程中的虚假解锁 的相关文章

  • BOOST 中的属性图是什么?

    有人可以向像我这样的 Boost 初学者解释一下 Boost 中的属性映射是什么吗 我在尝试使用 BGL 计算强连通分量时遇到了这个问题 我浏览了属性映射和图形模块的文档 但仍然不知道如何理解它 以这段代码为例 make iterator
  • Meteor.setTimeout 和 Meteor.methods 之间的并发

    在我的 Meteor 应用程序中实现回合制多人游戏服务器 客户端通过发布 订阅接收游戏状态 并且可以调用 Meteor 方法sendTurn将回合数据发送到服务器 他们无法直接更新游戏状态集合 var endRound function g
  • 线程睡眠和Windows服务

    我正在开发一个 Windows 服务 该服务存在一些问题Thread Sleep 所以我想我会尝试使用计时器 因为这个问题建议 在 Windows 服务中使用 Thread Sleep https stackoverflow com que
  • 如何构建支持 C++0x 的 Boost?

    我不知道如何使用 C 0x 编译器构建 Boost 必须给 bjam 提供哪个选项 应该修改 user config 文件吗 有人可以帮助我吗 最好的 维森特 我已经找到答案了 我正在等待类似 std 的功能 并将其命名如下 bjam st
  • ThreadPool.SetMinThreads 不创建任何新线程

    我想弄清楚到底有什么影响ThreadPool SetMinThreads makes 根据官方文档 https learn microsoft com en us dotnet api system threading threadpool
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • Volatile.Read 和 Volatile.Write 背后的逻辑是什么?

    来自 MSDN Volatile Read 读取字段的值 在需要它的系统上 插入一个 阻止处理器重新排序内存的内存屏障 操作如下 如果在该方法之后出现读或写 代码 处理器无法移动它before这个方法 and Volatile Write
  • 一段时间后终止线程的最 Pythonic 方法

    我想在线程中运行一个进程 它正在迭代一个大型数据库表 当线程运行时 我只想让程序等待 如果该线程花费的时间超过 30 秒 我想终止该线程并执行其他操作 通过终止线程 我的意思是我希望它停止活动并优雅地释放资源 我认为最好的方法是通过Thre
  • 如何在同一线程中创建JFrame以使其阻塞?

    出于调试目的 我需要在一个简单的窗口中在屏幕上绘制图像 Swing 在单独的消息循环线程中处理所有事件 这意味着如果我执行以下操作 while true Get screenshot BufferedImage screenshot MSW
  • Thread.sleep vs Monitor.Wait vs RegisteredWaitHandle?

    以下项目有不同的目标 但我很有趣知道它们如何 暂停 问题 Thread sleep 它会影响系统性能吗 它是否会占用线程的等待时间 关于什么Monitor Wait 他们 等待 的方式有何不同 他们的等待会占用一个线程吗 关于什么Regis
  • 用于建模一般树结构及其迭代器的智能指针

    我通过为每个节点建立一个类来建模一般树结构 该类包含指向父级 第一个子级和第一个兄弟级的指针 以及指向最后一个兄弟级的指针 不需要 但有用 为此 我添加了一些额外的数据 我目前的实现是 class TreeNode typedef boos
  • boost线程在中断时不打印退出消息

    我有这段代码用于执行三个线程 其中第二个线程应在按 Enter 时中断并打印退出消息 void input val DO STUFF return void process val DO STUFF try cout lt lt waiti
  • 使用Python构建caffe(找不到-lboost_python3)

    我正在尝试用 python 构建 caffe 但它一直这样说 CXX LD o python caffe caffe so python caffe caffe cpp usr bin ld cannot find lboost pytho
  • 为什么我的多螺纹嵌件比单螺纹嵌件性能更好?

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

    我有一个基类实现INotifyPropertyChanged protected void OnNotifyChanged string pName if PropertyChanged null PropertyChanged this
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 如何有条件地检查枚举是一种变体还是另一种变体?

    我有一个有两个变体的枚举 enum DatabaseType Memory RocksDB 为了在函数内创建条件 if 来检查参数是否为 我需要什么DatabaseType Memory or DatabaseType RocksDB fn
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer

随机推荐

  • 使用终端和 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