”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > “易失性”在 C++11 多线程中仍然相关吗?

“易失性”在 C++11 多线程中仍然相关吗?

发布于2024-11-16
浏览:897

Is `volatile` Still Relevant in C  11 Multithreading?

C 11 中的 Volatile 变量

C 11 标准中多线程机器模型的引入引发了有关 volatile 行为的问题变量,传统上用于防止可能导致并发环境中未定义行为的优化。

在 C 98/03 中,内存模型中缺乏对多线程的识别意味着编译器可以优化无法读取易失性变量,从而导致臭名昭著的无休止 while 循环等待变量更改其值的示例。

但是,C 11 内存模型承认并发访问变量的可能性。这是否意味着 volatile 现已被弃用?

编译器优化和未定义行为

答案在于 C 11 内存模型的细微差别。虽然它识别多线程,但它并不能消除在没有正确同步的情况下访问变量时出现未定义行为的可能性。即使在多线程环境中,对共享变量的非原子访问仍然是未定义的。

volatile int x;
void func() {
x = 0;
while (x = = 0) {}
}

因此,在我们的示例代码中,编译器仍然可以自由地优化 while 循环中 x 的读取,从而导致未定义的行为。易失性仅影响内存访问,而不影响线程行为。

内存屏障和线程完整性

线程完整性需要适当的同步机制,以确保一个线程中的写入对另一个线程的可见性。 C 11 内存模型专门定义了写入何时以及如何对其他线程可见。易失性不满足此要求。

易失性保证编译器无法优化从变量读取的内存,但它不提供有关线程可见性的任何保证。由同步结构(如锁或原子操作)发出的内存屏障对于确保写入在核心之间同步是必要的。

结论

在 C 11 中,易失性仍然相关用于防止可能导致不正确的内存访问的优化。然而,这对于多线程编程来说还不够。仍然需要适当的同步机制来保证并发环境中线程的完整性和定义的行为。

最新教程 更多>
  • 三元条件运算符在编程中如何工作?
    三元条件运算符在编程中如何工作?
    理解三元条件运算符编程中,使用问号(“?”)和冒号(“:”)运算符括号内形成三元条件运算符。它提供了传统 if-else 语句的简洁替代方案,允许您评估条件并根据其真实性分配值。语法和用法The三元运算符遵循语法:boolean_expression ? true_value : false_val...
    编程 发布于2024-11-16
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-16
  • 如何访问 Maven 依赖项的源代码和 Javadoc?
    如何访问 Maven 依赖项的源代码和 Javadoc?
    在 Maven 存储库中查找源 JARMaven 是一种流行的 Java 项目包管理工具,提供了广泛的库及其依赖项存储库。通常,开发人员需要访问与这些依赖项关联的源代码或 Javadoc,以进行调试或文档记录。虽然 Maven 存储库通常存储二进制 JAR 文件,但有一种方法可以使用 Maven 检...
    编程 发布于2024-11-16
  • 扩展 Quarkus:何时以及如何编写自己的扩展
    扩展 Quarkus:何时以及如何编写自己的扩展
    Quarkus 凭借其创新的扩展框架,为开发人员提供了一种将各种技术无缝集成到其应用程序中的强大方法。这些扩展简化了配置、启用依赖项注入并优化了性能,使其成为 Java 开发人员的一个有吸引力的选择。然而,在深入创建您自己的 Quarkus 扩展之前,了解何时需要以及如何有效地做到这一点至关重要。 ...
    编程 发布于2024-11-16
  • 如何在 JavaScript 中将数组作为函数参数传递?
    如何在 JavaScript 中将数组作为函数参数传递?
    在 JavaScript 中将数组作为函数参数传递将数组作为单独的参数传递给函数可能是乏味且低效的。考虑以下代码:const x = ['p0', 'p1', 'p2']; call_me(x[0], x[1], x[2]); // Unwieldy and prone to errors解决方案1...
    编程 发布于2024-11-16
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1和$array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求是构...
    编程 发布于2024-11-16
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-16
  • 为什么 Docker 在 macOS 上的性能比在本机 Linux 系统上慢?
    为什么 Docker 在 macOS 上的性能比在本机 Linux 系统上慢?
    macOS 上的 Docker 性能问题在 macOS 中运行 Docker 时,用户经常会遇到明显的性能限制,从而成为高效开发的障碍。这个问题源于 macOS 上 Docker 架构的基本性质。Docker 需要 Linux 内核才能运行,但 macOS 本身并不提供 Linux 内核。相反,它使...
    编程 发布于2024-11-16
  • 如何根据同名其他行的数据更新表中的空值?
    如何根据同名其他行的数据更新表中的空值?
    在表中的行之间复制数据在数据库管理中,经常需要根据表中其他行的数据来更新行同一张桌子。考虑一个包含 ID、NAME 和 VALUE 列的表,其中包含重复的 NAME 值,如下所示:ID | NAME | VALUE | ---------------------------- 1...
    编程 发布于2024-11-16
  • 为什么在 Go 中使用 mgo 时我的“_id”字段为空?
    为什么在 Go 中使用 mgo 时我的“_id”字段为空?
    使用 mgo 在 Go 中检索“_id”字段值的问题排查本文解决了无法检索“_id”字段值的问题当将 mgo 与 Go 一起使用时。尝试从 MongoDB 数据库获取数据时遇到了问题。首先,代码片段定义了一个名为“Article”的结构体,它表示数据库中的文档。它包含“_id”、“title”、“a...
    编程 发布于2024-11-16
  • 如何修复 MySQL 中的双编码 UTF8 字符?
    如何修复 MySQL 中的双编码 UTF8 字符?
    从双编码 UTF8 字符中恢复之前使用 LOAD DATA INFILE 导入的数据被错误地假定为以 Latin1 编码。因此,多字节字符被拆分为单独的字节,随后以 UTF8 进行编码,从而产生双重编码。这会导致字符损坏,例如“Ò±”而不是“ñ”。要纠正这些错误,可以使用特殊的 MySQL 函数在双...
    编程 发布于2024-11-16
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-16
  • 如何根据纬度和经度计算距离并创建边界框?
    如何根据纬度和经度计算距离并创建边界框?
    测量距离并根据纬度和经度创建边界框计算两个地理坐标(纬度和经度)之间的距离对于以下领域至关重要各种应用程序,例如地图和导航。大圆距离,也称为半正弦公式,可以精确估计地球表面两点之间的距离。确定距离后,下一步就是定义边界框围绕某个特定点。该框用于将点封装在特定地理区域内。要创建此框,我们需要找到位于原...
    编程 发布于2024-11-16
  • CSS 中的相对路径是相对于 HTML 文件还是 CSS 文件?
    CSS 中的相对路径是相对于 HTML 文件还是 CSS 文件?
    CSS 文件中的相对路径是否相对于 CSS 文件?使用 CSS 时,引用图像等外部文件CSS 文件是一种常见的做法。了解这些引用的相对路径对于正确的文件位置至关重要。CSS 中的相对路径:仔细查看CSS 文件中的相对路径是相对于CSS 文件本身,而不是使用 CSS 文件的 HTML 文件。这意味着在...
    编程 发布于2024-11-16
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-11-16

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3