C++ 中条件变量的常见用途是什么?

2023-12-30

我正在尝试了解条件变量。我想知道使用条件变量的常见情况有哪些。

一个示例是在阻塞队列中,其中有两个线程访问队列 - 生产者线程将一个项目推入队列,而消费者线程从队列中弹出一个项目。如果队列为空,则消费者线程将等待,直到生产者线程发送信号。

还有哪些其他设计情况需要使用条件变量?

不过,我更喜欢基于经验的示例,例如实际应用程序中的示例。


条件变量的一种用途是“共享锁”,它比消息队列稍微复杂一些,其中不同的线程正在等待具有相同基本性质的细微不同的条件。例如,您有一个(非常简陋、简化的)网络缓存。缓存中的每个条目都有三种可能的状态:不存在、IN_PROGRESS、COMPLETE。

getURL:
    lock the cache
    three cases for the key:
        not present:
            add it (IN_PROGRESS)
            release the lock
            fetch the URL
            take the lock
            update to COMPLETE and store the data
            broadcast the condition variable
            goto COMPLETE
        COMPLETE:
            release the lock and return the data
        IN_PROGRESS:
            while (still IN_PROGRESS):
                wait on the condition variable
            goto COMPLETE

我在实践中使用该模式来实现 POSIX 函数的变体pthread_once无需调度程序的任何帮助。我不能使用信号量或锁的原因once_control,并且只是在锁下进行初始化,函数不允许失败,并且once_control仅进行了简单的初始化。对于这个问题,pthread_once本身没有定义的错误代码,因此实现它可能会失败并不会给你的调用者留下任何好的选择......

当然,对于这种模式,您必须小心缩放。每次初始化完成时,每个等待线程都会醒来以获取锁。因此,当您设计系统时,您会非常仔细地考虑分片,然后决定在看到经过验证的性能问题之前,您不会费心做任何实际实现它的事情。

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

C++ 中条件变量的常见用途是什么? 的相关文章

随机推荐

  • 在命令行 Dart 应用程序中清除终端屏幕

    这个不起作用 在 Windows 的 Cmd Box 中 import dart io void main print Hello World Process start cls runInShell true then process s
  • Dart 中的 patch 关键字有什么作用?

    有人可以解释一下 patch 关键字的作用吗 例如 在math patch dart I see patch num pow num x num exponent gt MathNatives pow x exponent patch do
  • 向 ggplot 条形图添加标签

    我想做一个黑色轮廓的条形图 条形内有百分比 这可以从 qplot 中实现吗 我得到了显示的百分比 但它们与特定的条形不一致 软件包 ggplot2 重塑 x lt data frame filename c file1 file2 file
  • Symfony2 JSON 响应返回奇怪的 UTF 字符

    这是我的控制器方法 public function sendjsonAction message this gt getDoctrine gt getRepository AcmeStoreBundle Message gt findAll
  • 不明确的隐式值是我们想让错误存在于编译时的唯一方法吗

    trait Foo trait Bar extends Foo def doStuff T lt Foo x T implicit ev T Foo x doStuff new Foo ambiguous implicit value do
  • 如何在 IE 中翻转网站? (4月1日)

    我们正在办公室进行 4 月 1 日的恶作剧 并希望明天将我们的公司网站翻转几个小时 我的补丁在任何地方都有效 但在 IE 中无效 任何人都可以帮忙吗 尝试这个 http msdn microsoft com en us library ms
  • 非负集减法

    这适用于任何语言 但我会在节点中实现它 我有一组整数 以及一个需要从该组总和中减去的值 4 5 6 7 8 25 如果我们均匀地减去每个数字 我们会得到 1 0 1 2 3 但是 我不希望任何小于 0 的数字 因此 如果我编写一个算法来执行
  • Rails 生成 has_many 关联

    有没有办法使用以下方法为列生成 has many 关联Rails generate scaffold控制台中的命令 I know belongs to可用并且有用例references但不确定has many 没有用于 a 的列has ma
  • 粘页脚失败

    我正在尝试使页脚正确 但遇到问题 我能够将页脚保持在页面底部 但很快意识到当窗口变小时 它最终会覆盖内容 我可以通过取消position absolute来解决这个问题 但是如果我这样做 页脚将不再停留在页面底部 我已经尝试了很多不同的方法
  • MATLAB 中冒号运算的组合

    我有一个关于 MATLAB 中冒号运算符和向量扩展的问题 我的问题是理解以下代码行如何扩展 以便能够将其用于其他序列 MATLAB 代码行是 a 1 2 5 1 4 7 注意a扩展前未定义 这返回向量 a 1 0 3 0 7 我知道冒号运算
  • WinForms 拖放中的 e.Data.GetData 转换问题

    我试图在程序的两个实例之间进行拖放 但是当我尝试将数据转换为我的类型时 它会抛出无效的转换异常 这是代码 protected virtual void GetDropIEntities DragEventArgs e foreach str
  • 无法理解字符串排列 Java 代码

    我有这个工作代码可以打印字符串排列而无需重复 但无法理解它在逻辑上是如何工作的 任何建议都会非常有帮助 private static void permutation String input String sofar if input e
  • 使用 AutoMapper 和 DI 容器实例化类型

    请看下面的代码 public class Test ITest public ITest2 iTest2 public int id public string name public Test ITest2 test2 iTest2 te
  • JPQL avg 聚合函数是否适用于整数?

    我有一个名为的 JPA 2 实体Surgery 它有一个名为输血单位那是一个Integer 数据库中有两个条目 执行此 JPQL 语句 Select s transfusionUnits from Surgery s 产生预期结果 2 3
  • 如果在多台计算机上使用 Test-Connection 和 -Quiet,我如何知道哪个结果适用于哪台计算机?

    如果在多台计算机上使用 Test Connection 和 Quiet 我如何知道哪个结果适用于哪台计算机 e g computers PC1 PC2 PC3 results Test Connection ComputerName com
  • 为什么这些错误属性不显示在键下?

    看来是从Object getOwnPropertyNames 与 Object keys https stackoverflow com questions 22658488 object getownpropertynames vs ob
  • 代码运行时的 ASP.NET 应用程序日志/进度条

    我正在我的 ASP 表单 Web 应用程序中构建 OCR 扫描模块 您可能知道 这样的操作可能需要一些时间 因此 我使用后台服务应用程序来响应运行代码的消息队列 因此用户甚至不必停留在同一网页上 我想做的是通知用户服务运行时发生了什么 如果
  • 如何使用 CSS 反转颜色?

    HTML div p inverted color p div CSS div background color f00 p color how to use inverted color here in relation with div
  • Rust 中的严格别名?

    我的理解是 由于所谓的 严格别名规则 以下代码在 C 中具有未定义的行为 include
  • C++ 中条件变量的常见用途是什么?

    我正在尝试了解条件变量 我想知道使用条件变量的常见情况有哪些 一个示例是在阻塞队列中 其中有两个线程访问队列 生产者线程将一个项目推入队列 而消费者线程从队列中弹出一个项目 如果队列为空 则消费者线程将等待 直到生产者线程发送信号 还有哪些