如何解决 C++ 中用于维护静态局部变量的服务数据的线程安全性?

2023-12-02

考虑以下场景。我们有一个带有静态局部变量的 C++ 函数:

void function()
{
    static int variable = obtain();
    //blahblablah
}

该函数需要同时从多个线程调用,因此我们添加一个临界区以避免并发访问静态本地:

void functionThreadSafe()
{
    CriticalSectionLockClass lock( criticalSection );
    static int variable = obtain();
    //blahblablah
}

但这就足够了吗?我的意思是有一些魔法可以使变量初始化不超过一次。因此,运行时维护了一些服务数据,指示每个静态本地是否已初始化。

上述代码中的关键部分也会保护该服务数据吗?这种情况需要额外的保护吗?


C++ 规定静态变量只能初始化一次——但是 C++ 还不处理线程。

gcc(至少在 *nix 系统上)发挥了适当的作用来安全地保护初始化此类静态变量的多个线程。根据这个链接,msvc 则不会 - 在这种情况下,您必须自己锁定初始化。

用关键部分保护初始化应该保护所有这些 - 即你的 functionThreadSafe() 是可以的 - (除非obtain()本身调用functionThreadSafe()

这篇博客文章在这方面值得一读。

就我个人而言,为了避免意外,我会尝试重写它,以便您可以初始化variable在创建任何线程之前,您自己一次 - 例如

static int variable = 0;
void init_variable() //call this once, at the start of main()
{
  variable = obtain();
}

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

如何解决 C++ 中用于维护静态局部变量的服务数据的线程安全性? 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • cin 条件检查错误

    我是一名学习c 的初学者程序员 我在使用 cin 命令时遇到了一个棘手的问题 在下面的程序部分中 如果我在第一个 cin 命令处输入错误的类型 则程序将根本不会执行以下任何 cin 命令 但会执行程序的其余部分 start include
  • CSS:顶部与顶部边缘

    我不确定我是否完全理解这两者之间的区别 有人可以解释为什么我会使用其中一种而不是另一种以及它们有何不同吗 如果您想将一个 块 元素从文档流中的其他元素移开 您可以使用边距 这意味着它将把以下元素推开 进一步向下 请注意 相邻块元素的垂直边距
  • 如何返回数组中可能存在的一组连续数字?

    如果我有一个已排序的数组 如何找到连续的数字 顺便说一句 这是为了确定扑克牌是否是顺子 数组中的重复项已被删除 我可以做到这一点 但这将是一种多行方法 我认为可能有一个使用可枚举方法的快速单行方法 例如 FindSequence 9 8 7
  • 如何知道黑莓设备是否有 GPS?

    我想知道设备是否有 GPS 对于 5 0 以下的设备如何做到这一点 查看文档Location Provider 在不同情况下的一些设备上尝试此代码 我认为它应该有效 try LocationProvider lp LocationProvi
  • 如何获取 Spring 4.1 使用的 Jackson ObjectMapper?

    Spring 4 1实例化一个JacksonObjectMapper实例 我有理由想要 Autowire将该实例放入我的一个控制器中 该控制器使用 Jackson 对它自己进行一些小的 JSON 解析 但是ObjectMapper它使用的应
  • 将container_of宏应用于嵌入的char数组时报告警告

    当我申请时container of宏到包含 char 数组的 C 结构 我得到警告 从不兼容的指针类型进行初始化 这是代码 define container of ptr type member const typeof type 0 gt
  • 字符串文字中的转义序列 (Fortran)

    C 中有一个例子 string str str First n Second n Third n cout lt lt str lt lt endl 输出将是 First Second Third 我想尝试在 Fortran 中重复它 但没
  • 如何连接Python IMAP4_SSL和自签名服务器SSL证书?

    我正在使用 python3 和imaplib连接到 Exchange 服务器 Exchange 服务器使用为主机名 my server fqdn 创建的自签名证书 最近在我的工作站 Ubuntu 14 04 上升级操作系统后 我的 pyth
  • Cin.get() 与 C++ 的问题[重复]

    这个问题在这里已经有答案了 我仍然不知道 Visual Studio 是如何工作的 据说它会让我的控制台保持打开状态 但事实并非如此 它仍然闪烁并关闭 难道我做错了什么 include
  • 我的 Linux 可执行程序(64 位)中的段 00 是什么

    这是一个非常简单的汇编程序 只需返回12执行后 cat a asm global start section text start mov rax 60 system call for exit mov rdi 12 exit code 1
  • 使用 htaccess 进行子域重定向,无需更改地址栏中的 URL

    我在我的网络主机上设置了一个子域 如下所示 en domain com pointing to the folder en 但是当在地址栏中输入 en domain com 时 URL变为 domain com en 如果我进一步导航 假设
  • 跨域心跳无法用jquery解析json数据

    我将我的模块 一个 asp net 项目 嵌入到 门户 中 门户生成一个 iframe 到我的 url 我知道它很糟糕 但我没有做到 为了避免在用户迭代我的 Web 项目时在主 门户 端进行会话 门户所有者告诉我通过 javascript
  • windows cmd shell 中的单个抑扬符是什么意思:更多?

    这可能不是一个真正与编程相关的问题 但我想知道很长一段时间 下面的cmd命令是什么意思 只需在 cmd shell 中输入一个抑扬符 Windows 就会要求更多 而只要你输入偶数个抑扬符 Windows 就无法获得足够的信息 从 Vist
  • 使用 renderscript 计算数组中值的总和

    嗨 我是新手 正在尝试编码渲染脚本 我想知道如何使用渲染脚本对数组中的元素求和 有没有办法可以将输出传递回脚本以进行顺序添加 我的问题陈述是 向量和 描述 计算数组中值的总和 输入 整数数组 输出 整数 任何帮助将非常感激 恐怕这比看起来要
  • 时间:2019-03-17 标签:c#list permutations with limit length

    我有一个报价列表 我想从中创建链长度有限的 链 例如排列 我已经使用 Kw Combinatorics 创建排列了project 但是 默认行为会在列表计数的长度中创建排列 我不知道如何将链长度限制为 n 这是我当前的代码 private
  • 在同一个 jlabel 上重新显示其他 img 存在困难

    我有点卡住了 当我按下提交按钮时 应该在 JLabel 图像的同一位置重新显示另一张图片 因此如果有人有任何想法 我将不胜感激 我正在使用 eclipse 并且程序正在编译和运行 这是代码 Here is the GUI of the pr
  • 控制表单字段访问的最佳实践

    我有一个经典的 3 层 ASP Net 3 5 Web 应用程序 其中包含显示业务对象并允许编辑它们的表单 表单上的控件对应于基础业务对象的属性 根据用户的角色 用户可以读 写 只读或无权访问各种控件 非常传统的东西 我的问题是 编码的面向
  • 将键值对分成两个数组

    将键和值分离到两个不同的数组中的最佳方法是什么 这样 var data A Key 34 Another Key 16 Last Key 10 会变成这样 data1 A Key Another Key Last Key data2 34
  • html5视频flash后备建议

    我正在使用 html5 video 标签 想知道您是否可以帮助回答以下问题 当包含不同的文件格式 mp4 ogg 等时 我是否还必须包含 flv 作为 Flash 后备 或者浏览器是否知道自动默认为 Flash 版本 目前我只使用 mp4
  • 如何解决 C++ 中用于维护静态局部变量的服务数据的线程安全性?

    考虑以下场景 我们有一个带有静态局部变量的 C 函数 void function static int variable obtain blahblablah 该函数需要同时从多个线程调用 因此我们添加一个临界区以避免并发访问静态本地 vo