如何解决 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++ 中用于维护静态局部变量的服务数据的线程安全性? 的相关文章

  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • asp.net core / kestrel中的线程管理

    我正在解决我们已迁移到 asp net core 2 0 的 asp net 应用程序的性能 可扩展性问题 我们的应用程序作为应用程序服务托管在 azure 上 并且在任何中等流量的情况下都很容易崩溃 让我困惑的一件事是如何处理多个并发请求
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 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