C++内存模型是否提供有关构造函数操作的保证[关闭]

2023-11-29

如何确保新构造的不可变对象可以在 C++ 线程之间安全共享? C++ 内存模型是否为构造函数的操作提供保证?

当多个线程共享对某个对象的访问并且该对象被修改时,可能会出现竞争危险。这些问题可以通过以下方式避免安全发布该对象传递给所有线程(包括所有可能的未来线程),因此从任何线程对该对象的所有后续访问都会看到相同的对象状态,然后避免修改该对象。如果不使用锁(互斥体),后续对该对象的访问将不会受到竞争危险的影响。在极端情况下,该对象是不可变的: 一旦构建,就永远不会改变。因此,有一种习惯用法是在多线程程序中尽可能使用不可变对象。

这仍然需要在构造函数中的代码执行后安全地发布对象。例如,构造函数执行的代码将值分配给内存位置,但这些写入的值可能(最初)仅存在于 CPU 的本地缓存中。访问这些内存位置的其他线程可能会看到记录在这些内存位置的旧值(例如由malloc, 例如)。对于新构造的对象所覆盖的内存位置,必须有一种机制来刷新本地缓存并使其他 CPU 的缓存无效。

在对高级可移植编程语​​言(如 C++)进行编程时,您不必关心缓存和缓存刷新的细节。相反,该语言提供了一组保证(内存模型),您必须根据一些习惯用法编写代码才能可靠地实现您的目标。

在Java中,这是自动地通过遵循类设计中的一些规则来完成(过度简化:做一切final,即有点像const in C++),Java内存模型保证会产生预期的效果。这可以通过在执行构造函数的代码后立即设置内存屏障来实现。

在 C++11 中这是如何完成的? C++ 内存模型是否提供有关构造函数操作的保证,使您能够自动发布新构造的对象?如果是这样,你们的课程规则是什么?如果没有,你必须自己添加一个内存屏障(如你显然必须为.Net做),是否有一种习惯用法可以在构造后有效地发布对象?

或者C++11不提供对不可变对象的线程安全无锁访问?您必须使用互斥锁来保护对共享对象(无论是否不可变)的所有访问吗?


主要有两种情况:

  1. 读取线程的创建是有序的——在对象创建之后
  2. 读取线程的创建是not在创建对象之后排序

在情况 1 中,对对象的读取访问自动是安全的,因为线程中的读取是在线程本身创建之后有序进行的。

在情况 2 中,您必须以某种方式对读取进行排序,这正是因为线程创建不提供顺序。很明显,如果在创建对象之后读取没有排序,那么事情就会出错。

您的问题想了解 CPU 缓存等详细信息。这是编译器编写者关心的问题。您只需遵守 C++ 排序规则即可。

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

C++内存模型是否提供有关构造函数操作的保证[关闭] 的相关文章

随机推荐

  • 使用请求的响应时间极长

    描述 我有一个运行 Python 应用程序的 AWS ec2 实例 ubuntu 16 其中我调用了一些 Facebook Account Kit API 和 Google Play Store API 它们都工作得很好 直到我两周前重新启
  • 如何从表格单元格(td)中获取相应的表格标题(th)?

    给定下表 我如何获取每个 td 元素对应的表头 table thead tr th Name th th Address th tr thead tbody tr td Bob td td 1 High Street td tr tbody
  • Golang 中的类型转换

    我正在阅读以下文章 https www ribice ba golang enums 代码示例之一中定义了一个函数 func lt LeaveType UnmarshalJSON b byte error Define a secondar
  • 用于文本选择控件的自定义浮动工具栏

    我想自定义选择文本时出现的浮动工具栏 这是标准浮动工具栏的示例 你知道我如何定制它 比如添加粗体 斜体 吗 有外部图书馆吗 Monospace 应用程序正是我想要的 您将向清单中的活动添加一个意图过滤器
  • Flask Postgresql 数组不会永久更新

    我正在开发一个使用 Flask 和 PostgreSQL 数据库以及 SQLAlchemy 的项目 I have Group具有以下列表的对象User属于该组成员的 ID 由于某种原因 当我尝试将 ID 添加到组时 它无法正确保存 如果我尝
  • 谷歌折线图 X 轴上有双标签

    我正在研究谷歌折线图 我想在 x 轴上加双标签 日期明智的过程 我可以使用下面的代码绘制没有日期的图表 但无法填充日期 div style width 100 height 1 div
  • 错误:getaddrinfo ENOTFOUNDregistry.npmjs.orgregistry.npmjs.org:443

    我正在公司网络上工作 正在尝试安装npm 但我一次又一次地收到此错误 npm install npm ERR Windows NT 6 1 7601 npm ERR argv C Program Files nodejs node exe
  • 在 Swift 中声明自引用指针[重复]

    这个问题在这里已经有答案了 这段 Obj C 代码在 swift 中的等价物是什么 我猜测 CMutableVoidPointer 的一些事情 static void CapturingStillImageContext Capturing
  • Nhibernate 通过用户定义的函数输出进行过滤

    我对 NHibernate 相当陌生 到目前为止一切都进展顺利 但我遇到了一个问题 我不太确定如何解决 基本上我需要按用户定义函数的输出进行过滤 如果我用 SQL 编写 我会这样写 declare Latitude decimal decl
  • Coldfusion 8 同时执行 CFIf 和 CFElse 语句

    我正在为电子商务网站制作用户注册应用程序 但我遇到了一个非常奇怪的问题 当我运行这段代码时
  • C++ 中的临时对象确实是 const 吗?

    我一直认为C 中的临时对象会被编译器自动视为const 但最近我经历了以下代码示例 function returning object some non const method 对 C 编译器有效 这让我想知道 C 中的临时对象确实是 c
  • PHP 匿名函数:未定义的变量

    我有这两个 WordPress 功能 wpb set post views function postID count key wpb post views count count get post meta postID count ke
  • Codeigniter 与本地主机 (XAMPP) 中的路径有关的问题

    无论如何 我的代码点火器安装中的索引页面 又名 homepage php 都工作正常 The problem lies with using subdirectories to store other pages currently its
  • android 中网页视图内容闪烁?

    我在用着this用于水平滑动的 lib 检查下面的代码 滑动功能工作正常 但当我直接滑动时 不会在网页视图上显示内容 显示下面的一些图片以了解更多详细信息 在上图之后 当我滑动时 它效果很好 但是当我们想直接进入下一张幻灯片时 就会面临如下
  • 始终显示 AVPlayer 控件

    我有一个 AVPlayerViewController 里面有一个 AVPlayer 我需要的是播放器的控件 播放 暂停 时间滑块 永远不会隐藏 现在 在播放视频大约 4 秒后 它们就会隐藏起来 您必须点击屏幕才能再次显示它们 我无法找到解
  • 当menuItem中使用shiny和shinydashboard的更多功能时,tabItem无法显示内容

    我正在学习闪亮和闪亮的仪表板 我的代码是这样的 library shiny library shinydashboard library DT library RODBC library stringr library dplyr ch l
  • 如何在 Yesod 应用程序中的 GHCi 中执行数据库查询

    例如 如何使用 Yesod 应用程序的模型将新用户插入数据库 或者 还有更好的方法 我正在处理脚手架应用程序 现在我创建了App实例 但不知道如何使用它执行请求 i Extra data Extra Extra extraCopyright
  • 如何将svg中的一条路径分成两条路径

    我对 svg 语法非常陌生 我想知道如何将一条路径分成两条路径 实际上我有这样的东西 M Xm Ym C Xc1 Yc1 Xc2 Yc2 Xc3 Yc3 C Xd1 Yd1 Xd2 Yd2 Xd3 Yd3 C 是我要分割路径的地方 我想将其
  • Oozie 与 Hadoop 2,作业挂在“RUNNING”状态

    我有一个带有 java 操作节点的工作流程作业 使用 Hadoop 2 1 0 2 0 4 0 38 和 Oozie 3 3 2 2 0 4 0 运行 当我提交作业时 我在 Hadoop 资源管理器屏幕中看到 2 行 1 原职位名称 2 使
  • C++内存模型是否提供有关构造函数操作的保证[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 如何确保新构造的不可变对象可以在 C 线程之间安全共享 C 内存模型是否为构造函数的操作提供保证 当多个线程共享对某个对象的访问并且该对象被修改时 可能会出现竞争危险 这些问题可