C++11:重要的线程局部静态变量?

2024-02-25

我有一个X类:

class X { ... }

我想做这个:

void f()
{
    thread_local static X x = ...;

    ...
}

(实际上我使用的是 gcc 所以关键字是“__thread”)

但我不能,因为你只能有微不足道的 thread_locals。

对此最好的解决方法是什么?

如果我这样做:

void f()
{
    thread_local static X* p = 0;

    if (!p)
       p = new X(...);

    X& x = *p;

    ...
}

then:

  1. 线程退出时不会调用析构函数
  2. 不必要的动态内存分配。

Update:

这是我到目前为止所拥有的:

#include <iostream>
#include <type_traits>

using namespace std;

class X { public: X() { cout << "X::X()" << endl; }; ~X() { cout << "X::~X()" << endl; } };

void f()
{
        static __thread bool x_allocated = false;
        static __thread aligned_storage<sizeof(X),
             alignment_of<X>::value>::type x_storage;

        if (!x_allocated)
        {
                new (&x_storage) X;
                x_allocated = true;
                // add thread cleanup that calls destructor
        }

        X& x = *((X*) &x_storage);
}

int main()
{
        f();
}

这解决了动态内存分配问题。我只需要添加线程清理处理程序。有没有一种机制可以用 pthread 来做到这一点?


该标准描述了thread_local像其他一样作为存储说明符(static, extern等)见§7.1.1。该词的任何定义都没有对“简单”数据类型的限制。

该问题在C++11 之前的讨论文档 N2147 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2147.html(参见“线程变量动态初始化”一节)。其中包括对正确实施中涉及的关键问题的描述。显然 GCC 实施(static __thread)还没有解决这些问题(这与GCC没有正式支持C++11的事实是一致的)thread_local).

一种替代方案是boost::thread_specfic_ptr<>提及在之前的这篇文章中 https://stackoverflow.com/a/9149029/777186并描述了here http://www.boost.org/doc/libs/1_34_1/doc/html/boost/thread_specific_ptr.html.

另一种选择是使用std::thread对象来实现线程并确保每个实例维护自己的变量副本,可能包装在unique_ptr.

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

C++11:重要的线程局部静态变量? 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 如何将 Google 图表集成为 AngularJs 指令?

    有一些将 Google 图表集成为 AngularJs 指令的示例 像这个 http plnkr co edit YzwjuU p preview http plnkr co edit YzwjuU p preview Update 我想避
  • 为什么我的代码没有向标准输出打印任何内容? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试计算学生的平均分 impo
  • 如何获取角度形式数组中更改项目的索引

    我正在使用带有反应形式的 Angular 4 我有一个表单数组 我试图将其绑定到我在组件中跟踪的数组 我使用反应式表单 这样我就可以进行验证 所以我不想使用模板表单方法 我将项目添加到表单数组中 如下所示 createFormWithMod
  • 有没有办法用静态 OpenSSL 构建静态 Qt?

    原始问题略有不同 但属于更主要问题的一部分 我正在尝试在 Windows 上使用静态 OpenSSL 将 Qt 5 2 构建为静态 我的最终目标是发送单个二进制文件无需提供 libeay32 dll 和 ssleay32 dll 然而 在我
  • 角度异步等待中的单元测试位置

    我使用 Angular 9 与 karma 测试运行器和 jasmine 测试框架进行单元测试 我只想进行单元测试app component其中有一个依赖注入 app component ts import Component Embedd
  • HTML5 Canvas - 用图像填充圆圈

    如何在圆内绘制图像 如果我做 context beginPath context arc e pageX e pageY 161 0 Math PI 2 true context closePath 然后我如何使用 fill 用我绘制的图像
  • 为组合 ggplots 添加通用图例

    我有两个水平对齐的 ggplotsgrid arrange 我浏览了很多论坛帖子 但我尝试的所有命令似乎现在都已更新并命名为其他名称 我的数据如下所示 Data plot 1 axis1 axis2 group1 0 212201 0 35
  • Django:找出菜单中已选择的项目

    我确信我以前在 Stack Overflow 上见过这个问题 但我找不到它 所以这里什么也没有 我有一个普通的 Django 菜单 它使用 url 菜单项的标签和静态名称 现在我想为已选择的菜单项设置不同的样式 但是菜单是在基本模板中渲染的
  • Objective-C HashMap 等效项

    我正在尝试转换一段使用 HashMap 的 Java 代码 其中包含一个对象作为键 一个对象包含一个值 private static HashMap
  • zfcuser 注册后添加用户角色

    我使用 Zend Framework 2 以及 ZfcUser BjyAuthorize 和 Doctrine 作为数据库 到目前为止 注册等工作进展顺利 我的问题是 注册用户没有分配角色 所以我想在注册过程中向用户添加角色 用户 我想我可
  • 如何在 Windows 上禁用调试断言对话框?

    我有一堆以批处理模式运行的单元测试 有时 Visual C 库发出的调试断言会导致崩溃 这会弹出一个对话框 并且单元测试停止运行 直到我单击 确定 关闭对话框 如何让 C 程序在遇到断言时崩溃 就像在 Linux 上一样 而不是弹出烦人的对
  • Angular Elements - 未捕获类型错误:无法构造“HTMLElement”

    我一直在尝试让 Angular 元素组件正常工作 因为我正在考虑在即将到来的项目中使用它们 我已经遵循了许多教程 都非常相似 但无法让它们工作 其中一个教程是this one https www techiediaries com angu
  • tomcat后台线程

    我有一个正在运行的 tomcat 6 20 实例 并且想通过后台线程发送电子邮件以防止电子邮件发送功能阻止请求 有什么方法可以在后台执行线程 同时仍然允许正常的页面流发生 该应用程序是用 ICEfaces 编写的 Thanks 创建一个Ex
  • Maven Mojo 映射复杂对象

    我正在尝试编写一个 Maven 插件 包括 mvn 配置参数中自定义类的映射 有谁知道等效的 Person 类会是什么样子 http maven apache org guides mini guide configuring plugin
  • ld:未找到架构 x86_64 的符号

    并感谢您提前提供的所有帮助 我是 C C 新手 正在通过深入学习来自学 我正在尝试编写一个共享 静态 不确定区别 库并编写一个简单的程序来使用该库 我可能没有以最有效的方式做这件事 如果是Python 我一周前就完成了这个项目 但我更关心的
  • 嵌入式编程中的zalloc是什么?

    我正在研究对 ESP8266 串行 WiFi 芯片进行编程 在其 SDK 示例中 它广泛使用了一个名为os zalloc我期望的地方malloc 不过偶尔 os malloc也被使用 因此它们在功能上似乎并不相同 不幸的是没有文档 任何人都
  • 应用 UIView 变换后查找帧坐标 (CGAffineTransform)

    我旋转我的视图CGAffineTransform view setTransform newTransform 应用变换后 帧值保持不变 但如何找到该帧的 旋转 或变换值 source informit com http www infor
  • 需要一个例程来检测相似但不相同的字符串

    我有一个字符串列表 其中一些自我之前的版本以来已被修改 有些更改是微不足道的 间距 相差一个单词等 我想检测只有 微小 差异的字符串 以便如果可能的话我可以尝试使用旧的翻译 细微差别 是什么意思 在我开始使用数据库之前我不会知道 您是否知道
  • 如何从 scrapy 蜘蛛回调中收集统计信息?

    如何从蜘蛛回调中收集统计数据 Example class MySpider Spider name myspider start urls http example com def parse self response stats set
  • C++11:重要的线程局部静态变量?

    我有一个X类 class X 我想做这个 void f thread local static X x 实际上我使用的是 gcc 所以关键字是 thread 但我不能 因为你只能有微不足道的 thread locals 对此最好的解决方法是