C++11 我可以确保 condition_variable.wait() 不会错过通知吗?

2023-11-27

我让线程 1 执行以下代码:

unique_lock<mutex> ul(m);
while(condition == true)
    cv.wait(ul);

线程 2 执行以下代码:

condition = false;
cv.notify_one();

不幸的是我遇到了一个时间问题:

T1: condition checks true
                            T2: condition set to false
                            T2: cv.notify_one()
T1: cv.wait()

线程 1 完全错过了通知并在 wait() 上保持阻塞状态。我尝试使用 wait() 版本,它需要一个谓词,但结果基本相同。也就是说,谓词的主体执行检查,但在返回之前,条件的值会更改并发送通知。然后谓词返回。

我怎样才能解决这个问题?


您应该通过让线程 2 在更改标志之前锁定条件的互斥体来修复此竞争条件。

您正在描述未受保护的标志和条件发生的典型竞争条件。这些竞争条件是条件使用中互斥锁模式的原因。简而言之,始终使用互斥锁来保护检查条件值所涉及的变量。

在线程 2 的代码中:

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

C++11 我可以确保 condition_variable.wait() 不会错过通知吗? 的相关文章

随机推荐

  • 直接调用全局安装的Node.js模块

    假设我想为 Node js 编写一个要全局安装的模块 我不想编写任何 C 或其他东西 而是编写普通的 Node js 代码 基本上 这很容易 只需编写模块 然后使用安装即可npm install g 现在 大多数全局安装的模块都提供了直接调
  • elm 生成随机数

    我想在 elm 中的两个值之间生成一个随机 int 像这样的东西 nb random 0 10 我已阅读该文档和多篇文章 最好的答案来自这个 stackoverflowpost gen Random int 0 10 seed0 Rando
  • iOs 中 HTML5 音频元素的持续时间值存在问题

    我正在为 iOs 设备开发一个网络应用程序 但 html5 音频标签有问题 我设计了一个自定义音频播放器 并使用 JavaScript 函数控制歌曲 在 safari 桌面版上 该应用程序运行良好 但在 safari 移动版上 它无法识别音
  • 如何更改JFreeChart饼图颜色?

    如何自定义 JFreeChart 图形的颜色 让我们看看我的java代码 private StreamedContent chartImage public void init JFreeChart jfreechart ChartFact
  • Swift,与方法名相同的变量

    我有一个 var formVC UIViewController 我还试图有一个名为 func formVC gt UIViewController 我知道它在 OBJC 中有效 但我没有看到在 Swift 中做到这一点的方法 有没有办法解
  • ActionBarActivity 和 Fragment Activity 的区别

    我是 Android 菜鸟 我刚开始使用ActionBarActivity over FragmentActivity 他们之间有什么区别吗 FragmentActivity是基于支持的片段的基类 所以你将使用Fragment来自 API
  • 在 vue 3 中导入 bootstrapVue

    您好 我尝试在我的 vue 3 应用程序中使用 bootstrapVue 和 typescript 这里是我的 main ts import createApp from vue import App from App vue import
  • R 与其他非 Java 语言的接口/将 R 编译为可执行文件

    我开发了一个与数据库一起使用的 R 脚本 进行一系列处理并输出图形和表格 我可以将该数据输出为逗号分隔值和图片 以便稍后将它们导入到我的软件中 这没有问题 问题是如何分发我的应用程序而无需在客户端上完整安装 R 我见过 RJava 之类的东
  • Xcode 针对不同目标使用不同资源

    我正在开发一个 iPhone 应用程序 该应用程序将有完整版和精简版 为了从相同的源代码和 Xcode 项目中获取这两个包 我向 Xcode 项目添加了另一个目标 现在 我想让 Lite 目标仅将资源文件的子集复制到捆绑包中 但是 Xcod
  • 如何提取图像中的白色区域

    我有一个像这样的示例图像 我正在寻找一种方法来消除图像中的噪声 这样我最终会得到一个在白色背景上只有黑色文本的图像 以便我可以将其发送到超立方体 我尝试过变形 kernel np ones 4 4 np uint8 opening cv2
  • C# 获取列表中的非重复项[重复]

    这个问题在这里已经有答案了 有了这样的列表 int numbers 1 2 2 3 3 4 4 5 我可以使用 Distinct 函数删除重复项 因此列表将显示 1 2 3 4 5 然而 我想要相反的 我希望它删除所有重复的数字 留下唯一的
  • 获取标题不完全已知的窗口的句柄。 (C#)

    标题是部分静态的 带有可变后缀 例如 窗口标题 user id 在不知道确切标题的情况下如何获取句柄 查看所有进程并检查主窗口标题 您可以使用正则表达式 或者StartsWith etc foreach Process proc in Pr
  • Linq If 语句

    我如何在 linq toEntity 中写这样的东西 sb Append WHERE question question isdeleted 0 if catid 0 sb AppendFormat AND CatID IN 0 catsS
  • 将 EFS 卷附加到 Kubernetes Pod 时遇到问题

    我在 AWS EKS 上的 kubernetes 集群的帮助下运行我的 docker 容器 我的两个 docker 容器正在使用共享卷 并且这两个容器都在两个不同的 pod 内运行 所以我想要一个可供 aws 上的两个 Pod 使用的通用卷
  • 如何将 BufferedImage 保存为低于特定大小

    使用 java 8 给定图像用户需要能够指定最小 最大图像大小 以像素为单位 以及保存图像的最大大小 以 kbs 为单位 图像将保存为 jpg 所以我首先通过调整缓冲图像的大小来工作 public static BufferedImage
  • 如何指定决策树的 graphviz 表示的 Figsize?

    我有一个GraphViz在 iris 数据集上训练的决策树的表示 import graphviz dot data tree export graphviz clf out file None feature names iris feat
  • 警告:不允许使用广告密钥“服务数据”

    我正在开发 BLE 外设应用程序 根据要求 广告包中必须包含Service Data字段 我在Android中做到了这一点 数据包应该是这样的 0x16 是此处列出的服务数据字段https www bluetooth com specifi
  • ScriptApp.getService().getUrl() 的行为似乎已经改变

    Summary 我一直在使用ScriptApp getService getUrl 成功获取我的 Google Apps 脚本项目中的当前实例 dev prod 一段时间了 截至昨天 返回值似乎完全取决于 URL 是否以以下结尾 dev或不
  • 更改 Spring openapi-generator-maven-plugin 生成的接口的返回类型

    我已成功从 yaml open api 描述符文件生成接口 但是 如问题标题所示 我希望将这些接口的响应类型从 ResponseEntity 更改为我自己的类型 基本上而不是具有此签名的接口 ResponseEntity
  • C++11 我可以确保 condition_variable.wait() 不会错过通知吗?

    我让线程 1 执行以下代码 unique lock