访问共享内存进行读取时锁定

2023-12-05

如果我以只读方式访问共享内存,请检查某个条件if()块,我还应该锁定互斥锁吗?例如。

mutex_lock();

if (var /* shared memory */) {

}

mutex_unlock();

这里是否需要锁定并且是良好的做法?


如果您正在读取的变量可以同时写入,那么是的,您应该获取互斥锁上的锁。

如果你的编译器为你提供了必要的原语,你只能原子地读取它;这可能是 C11 和 C++11 附带的原子功能,也可能是编译器提供的其他语言扩展。然后,您可以将互斥体获取移动到条件中,但如果您等到测试之后才获取互斥体,那么其他人可能会在您测试它的时间和获取互斥体的时间之间更改它:

if (example) {
    // "example" variable could be changed here by another thread.

    mutex_lock();

    // Now the condition might be false!

    mutex_unlock();
}

因此,我建议在条件之前获取互斥体,除非分析已将互斥体获取确定为瓶颈。 (如果测试的变量大于 CPU 寄存器(例如 32 位 CPU 上的 64 位数字),那么您甚至无法选择在没有其他类型的情况下延迟互斥体获取原子获取或比较原语。)

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

访问共享内存进行读取时锁定 的相关文章

随机推荐

  • 动画片

    通过使用 r和 b转义序列来控制光标的位置 您可以使用文本创建翻页书样式的动画 以下是如何制作一个旋转器来指示忙碌状态 usr bin env python from time import sleep Show the spinning
  • 使用 Beautiful Soup 和 Python 进行网页抓取(概述)

    互联网上数量惊人的数据对于任何研究领域或个人兴趣来说都是丰富的资源 为了有效地收集这些数据 您需要熟练掌握网页抓取 Python 库requests和 Beautiful Soup 是完成这项工作的强大工具 如果您喜欢通过实践示例进行学习并
  • 在 Ubuntu Linux 16.04 上安装 Python

    了解如何使用 deadsnakes PPA 在 Ubuntu 16 04 中安装 Python 3 7 deadsnakes PPA 是一个包含旧版 Ubuntu 安装的现代 Python 版本的存储库
  • While 循环和列表

    在本课中 您将学习如何使用while 环形 该代码是在视频的实时会话中调试的 一个简单的例子可能如下所示 a fizz baz buzz while a print a pop 1
  • Python 的 map() 函数入门

    以下是有关 lambda 的资源和附加文档 如何使用 Python Lambda 函数 真正的 Python 文章 如何使用 Python Lambda 函数 真正的 Python 视频课程 Lambda 表达式 Python 文档
  • 选择优质包第 2 部分

    资源和链接 如何为 GitHub 项目编写出色的自述文件 dbader org 开源许可证解释 choosealicense com
  • Python 的 map() 函数:转换 Iterables(摘要)

    在本课程中 您学习了如何map 工作原理以及如何使用它来处理可迭代对象 你还了解了一些Pythonic您可以用来替换的工具map 在你的代码中 您现在知道如何 使用Pythonmap 使用map 到过程和转换不使用显式循环的迭代 结合map
  • Python 3.9 中很酷的新功能(概述)

    Python 3 9 来了 在过去的一年里 来自世界各地的志愿者一直致力于 Python 的改进 虽然 Beta 版本已经发布了一段时间 但 Python 3 9 的第一个正式版本已于2020 年 10 月 5 日 Python 的每个版本
  • 使用需求文件

    A 需求文件是项目所有依赖项的列表 这包括依赖项所需的依赖项 它还包含每个依赖项的特定版本 用双等号指定 pip freeze将列出当前项目的依赖关系stdout 此 shell 命令会将其导出为名为的文件requirements txt
  • 多处理模块

    在本课程中 您将了解为什么要采用这种方法 因为你的代码写在函数式编程风格 你可以相当容易地并行化它 有一个平行的map构建您可以使用的 这样 您就可以并行运行处理步骤 您将导入multiprocessing模块 因为它具有并行运行此操作所需
  • JSF:从 Jar 中提供资源

    我正在创建几个装有 Facelets 模板的罐子 供整个组织使用 在 JSF 1 2 中 此功能并不是开箱即用的 堆 Jboss EAP 5 1 Seam 2 2 富脸3 3 3 在我看来 我主要需要两个资源 查找 Faclets 资源的资
  • 在特定的开始、结束日期和时间限制内运行 Quartz Scheduler 作业

    我正在使用 Quartz Scheduler 来执行重复性任务 但我遇到了麻烦 在我的服务器端 我的用户想要指定一些日期范围 例如From 2013 09 27 with in 09 00 AM 12 00 PM to 2013 09 30
  • Pinterest 的官方 OAuth2 流程似乎返回无效的访问令牌

    我按照 Pinterest 的说明进行操作验证用户身份完成步骤 2 后 我手里拿着一个访问令牌 但是 当我使用此访问令牌进行 API 调用时 我收到以下响应 status failure code 3 host coreapp devpla
  • 有没有办法让 JQuery ajax 成功函数访问它所包含的对象?

    我有这样的 JavaScript function Cat this meow function meow ajax do AJAX call success this meow var TopCat new Cat 这不起作用 因为 th
  • 如何在正则表达式子例程中访问捕获组?

    我有一个模式想在几个地方使用 但我想访问该模式的内部部分 有没有办法做到这一点 In this 简化的例子 DEFINE lt isa gt s
  • 全局内存写入在 CUDA 中是否被视为原子?

    全局内存写入在 CUDA 中是否被视为原子操作 考虑以下 CUDA 内核代码 int idx blockIdx x blockDim x threadIdx x int gidx idx 1000 globalStorage gidx so
  • 通过参考返回

    PHP 文档中写道 不要使用按引用返回来提高性能 引擎 会自动对其进行优化 我希望返回对数组的引用 这是我的类的属性 PHP 如何优化这个 因为数组不是对象 如果数组有10亿个条目 如果我不通过引用传递它 我不会得到两个在内存中存储有10亿
  • MySQL SUM 函数在多个连接中

    嗨 这是我的情况 我有那些桌子 Customer id name Charges id amount customer id Taxes id amount charge id 所以我想计算费用和税费的总和 然后按客户 ID 分组 这是我的
  • EL 空运算符在 JSF 中如何工作?

    在 JSF 中 可以使用 EL 空运算符来呈现或不呈现组件 rendered not empty myBean myList 据我了解 该运算符既可以用作空检查 也可以检查列表是否为空 我想对我自己的自定义类的某些对象进行空检查 我需要实现
  • 访问共享内存进行读取时锁定

    如果我以只读方式访问共享内存 请检查某个条件if 块 我还应该锁定互斥锁吗 例如 mutex lock if var shared memory mutex unlock 这里是否需要锁定并且是良好的做法 如果您正在读取的变量可以同时写入