多线程环境下静态局部变量初始化

2024-01-01

假设有一个函数(可能是成员函数)

SomeType foo()
{
    static SomeType var = generateVar();
    return var;
}

How var将被初始化,如果foo会同时从多个线程中“第一次”调用吗?

  1. 是否保证generateVar()在任何情况下都只会被调用一次(当然如果使用的话)?
  2. 是否保证foo在任何场景下多次调用都会返回相同的值吗?
  3. 原始类型和非原始类型的行为有区别吗?

关于 C++03:

C++03 标准定义的抽象机不包含什么是 a 的正式定义thread是,如果同时访问一个对象,程序的结果应该是什么。

没有这样的概念同步原语,在不同线程中执行的操作的顺序,数据竞赛, 等等。因此,根据定义,每个多线程 C++03 程序都包含未定义的行为。

当然,在实践中,实现确实提供了记录的行为,但标准中没有任何内容指定该行为应该是什么。因此,我想说这取决于你的编译器。

答案的其余部分将重点关注 C++11,它确实定义了并发操作的语义。

关于 C++11:

是否保证generateVar()在任何情况下都只会被调用一次(当然如果使用的话)?

不,在任何情况下都不会。

的初始化var保证是线程安全的,所以generateVar()不会同时输入,但如果抛出异常generateVar(),或通过复制构造函数或移动构造函数SomeType (if SomeType当然是一个 UDT),那么下次执行流进入声明时将重新尝试初始化 - 这意味着generateVar()会再次接到电话。

根据 C++11 标准第 6.7/4 段有关块作用域变量初始化的规定静态存储时间:

[...] 如果初始化通过抛出异常退出,则初始化 不完整,因此下次控制进入声明时将再次尝试。如果控制进入 变量初始化时同时声明,并发执行需等待 完成初始化。如果在变量被调用时控制递归地重新进入声明 已初始化,行为未定义。 [...]

关于你的下一个问题:

是否保证 foo 在任何情况下多次调用时都会返回相同的值?

如果它能够返回一个值(见上文),那么是的。

原始类型和非原始类型的行为有区别吗?

不,不存在,除了没有基本类型的复制构造函数或移动构造函数之类的东西,因此也不存在复制初始化导致抛出异常的风险(当然,除非generateVar()投掷)。

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

多线程环境下静态局部变量初始化 的相关文章

  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • ASMX Web 服务,测试表单仅在本地计算机上适用于一种 WebMethod

    我有一个正在测试的 ASMX WebService 并且在大多数方法上我都可以使用测试表单进行测试 然而 我确实有一种方法 测试表上写着 The test form is only available for requests from t
  • PartialView Action 正在调用自身

    我有 MVC 应用程序 它用于从主视图 ProductMaster 将 ProductAreaGrid 列表显示为 PartialView 并且它将在局部视图内将 CreateProductArea 作为 PartialView 我的 Gr
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • 如何使用 C# 将表格粘贴到 Ms-Word 文档的末尾

    我有一个预制的 Word 模板 其中有一个表格 我想打开它 然后在文档末尾添加 粘贴 另一个表格 问题是它不会转到文档的末尾 而是将新表格粘贴到原始表格的第一个单元格中 任何帮助将不胜感激 previous code copied a ta
  • Code::Blocks 中的调试似乎不起作用 - 缺少调试符号

    我正在尝试在 Code Blocks 中调试程序 我跟着本指南 http wiki codeblocks org index php title Debugging with Code Blocks and 这个短视频 http www y
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • 在 C# 窗口应用程序中运行 C/C++ 控制台应用程序?

    现在 我想开发一个简单的应用程序 因此我决定最快的编码方式是 C NET 但现在 我很难实现我需要的功能之一 我想做的是在 C 应用程序的窗口内运行 C C 控制台应用程序 就像在虚幻前端中一样 添加一点通信方式 以便我可以为控制台应用程序
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • 包含从代码隐藏 (ASP.NET C#) 到 ASPX 中的图像概述的图像列表 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • C# 和断点 - 这里有魔术师吗?

    我有这个 public static void ByLinkText string text for var i 0 i lt 50 i try Setup Driver FindElement By LinkText text Click
  • 在两个点之间创建一条曲线,每个点都具有标准化向量

    因此 我需要一种写入方法来在两点之间创建一条曲线 每个点都有一个指向任意方向的归一化向量 我一直在尝试设计这样一种方法 但一直无法理解数学 在这里 由于一张图片胜过一千个文字 这就是我所需要的 在图中 矢量垂直于红线 我相信向量需要进行相同
  • boost::spirit::qi::语法和可变参数模板

    我在使用可变参数模板定义语法时面临一个问题 我首先定义一些包含在某些结构中的简单语法 例如纬度 经度 如下所示 include

随机推荐

  • 将大量数据从 iPad 转换/上传到 Dropbox

    我正在通过 Instruments 运行我的应用程序并使用大量数据对其进行压力来完成它 仪器测试进展顺利 但压力测试是我遇到问题的地方 在不涉及太多细节的情况下 我为我的应用程序提供了越来越多的Core Data它需要推断数据 制作图表并在
  • Angular 中的加密和 C# (.NET) 中的解密

    我有 Angular 中的数据加密代码 但我不知道如何在服务器端解密它 角码 public static getEncryptedInfo dataString string let password environment encrypt
  • 如何将 system.serviceModel 放入 ServiceConfiguration.cscfg (Windows Azure)

    我有以下代码 用于微软翻译
  • 在 Surfaceview 的画布上显示位图

    我正在尝试开发一个 Android 应用程序来显示可缩放 可平移的地图 这只是一个位图图像 它还允许用户单击地图上的某些点 我正在努力寻找实现此类应用程序的最有效方法 在尝试了许多其他方法 包括 Webviews OpenLayers 之后
  • LDAP:错误代码 49 - 简单绑定失败:NT_STATUS_LOGON_FAILURE

    我正在尝试对用户进行身份验证 但它抛出Exception 可能是配置有问题 public class LdapApplication private static final String INITIAL CONTEXT FACTORY c
  • 通过布尔属性使用“track by”过滤 Angular 1.2 ng-repeat

    我试图根据布尔属性的值过滤一些列表项 但无论我做什么 整个列表都会显示 我尝试过的一些东西已经损坏 没有任何显示 但这既不在这里也不在那里 我无法让我的过滤按预期工作 scope attendees firstname Steve last
  • 如何在 Scala 中向枚举添加方法?

    在 Java 中你可以 public enum Enum ONE public String method return 1 TWO public String method return 2 THREE public String met
  • REST 如何在 URI 中传递空路径参数?

    我正在开发一个安静的网络应用程序 在此我采用的参数是 userid 和 orderid The userid can be null URI 是 Path api user userid order orderid 我的方法是 void a
  • 最好的 GWT 小部件库? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何阻止 Meteor/Cordova 应用程序连接到 10.0.2.2? (为什么应用程序会连接到那里?)

    我有一个 Meteor 应用程序 它在本地服务器上运行以进行开发 http 10 0 2 10 3000 http 10 0 2 10 3000 The ROOT URL设置正确 所以 meteor runtime config ROOT
  • 检查列表中是否包含 Ansible 中的项目

    我正在尝试检查提供的版本是否是有效的受支持版本 我已在变量中设置了可接受版本的列表 如果提供的版本不在列表中 我希望任务失败 但是 我不确定如何做到这一点 role vars main yml acceptable versions 2 3
  • 比较两个分数(< 和朋友)

    我有两个我喜欢比较的分数 它们的存储方式如下 struct fraction int64 t numerator int64 t denominator 目前 我这样比较它们 bool fraction le struct fraction
  • Pyspark dataframes:根据另一列的值提取一列

    我有一个包含以下列和相应值的数据框 请原谅我的格式 但不知道如何将其放入表格格式 Src ip dst ip V1 V2 V3 top A B xx yy zz V1 现在我想添加一列 比如说top value它获取与 V1 中的字符串对应
  • 具有 http PUT 方法约束的属性路由

    我正在使用 MVC5 的新属性路由并已获取 httpGET and POST方法约束通过添加来工作 HttpGet and HttpPost 归因于我的行动方法 但是当我添加 HttpPut 我刚刚收到 404 错误页面 有谁知道我需要做什
  • VB6 和 VBA 的替代 IDE [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我已经被 Visual Studio 2008 宠坏了Eclipse https en wikipedi
  • 如何找到覆盖另一个矩形的矩形面积

    我有一个点 xmin ymin xmax ymax 列表 如黑点所示 How to find which are the rectangles that are being covered by another rectangle and
  • 如何在flutter中获取firestore文档的documentid?

    我已尝试以下操作 但它返回一个随机字符串 该字符串不存在于 firestore 中 我确实设法使用查询快照获取父集合的 documentid DocumentReference doc ref Firestore instance coll
  • MSTest 代码覆盖率

    我有一个 Web 服务的测试项目 当我在调试模式下运行测试时 一切正常 但是 当我刚刚运行测试时 对于我尝试获取代码覆盖率的引用程序集 出现以下错误 类初始化方法 WebServiceTest wstest MyClassInitializ
  • NodeJs 文件上传期间停止请求

    我正在编写一个图像上传器 我想将图像的大小限制在 3mb 以下 在服务器端 我可以检查标题中图像的大小 如下所示 使用express app post upload function req res if req headers conte
  • 多线程环境下静态局部变量初始化

    假设有一个函数 可能是成员函数 SomeType foo static SomeType var generateVar return var How var将被初始化 如果foo会同时从多个线程中 第一次 调用吗 是否保证generate