OMP 线程私有对象未被破坏

2024-01-14

底线

如何确保 threadprivate 实例被正确销毁?

背景

接听时这个问题 https://stackoverflow.com/questions/32347008/confused-about-firstprivate-and-threadprivate-in-openmp-context/32347782?noredirect=1#comment52589019_32347782我在 VS2013 中使用 Intel C++ 15.0 编译器时遇到了一个奇怪的问题。声明全局变量时threadprivate从属线程副本不会被破坏。我开始寻找强制摧毁它们的方法。在this http://www.viva64.com/en/a/0054/#ID0EWRDM网站上,他们说添加 OMP 屏障应该会有所帮助。事实并非如此(参见 MCVE)。我尝试将 OMP 阻塞时间设置为 0,以便线程不会在并行区域之后停留(也没有帮助)。我尝试添加一些虚拟计算来延迟主线程,从而给其他线程时间来终止。还是没有帮助。

MCVE:

#include <iostream>
#include <omp.h>

class myclass {
    int _n;
public:
    myclass(int n) : _n(n) { std::cout << "int c'tor\n"; }

    myclass() : _n(0) { std::cout << "def c'tor\n"; }

    myclass(const myclass & other) : _n(other._n)
                    { std::cout << "copy c'tor\n"; }

    ~myclass() { std::cout << "bye bye\n"; }

    void print() { std::cout << _n << "\n"; }

    void add(int t) { _n += t; }
};

myclass globalClass;
#pragma omp threadprivate (globalClass)

int main(int argc, char* argv[])
{
    std::cout << "\nBegninning main()\n";

    // Kill the threads immediately
    kmp_set_blocktime(0);

#pragma omp parallel
    {
        globalClass.add(omp_get_thread_num());
        globalClass.print();
#pragma omp barrier
        //Barrier doesn't help
    }

    // Try some busy work, takes a few seconds
    double dummy = 0.0;
    for (int i = 0; i < 199999999; i++)
    {
        dummy += (sin(i + 0.1));
    }
    std::cout << dummy << "\n";
    
    std::cout << "Exiting main()\n";
    return 0;
}

输出是

定义

开始 main()
定义
1
定义
3
定义
2
0
1.78691
退出 main()
bye bye

我本以为有四个“再见”,但只有一个。

Update

下列的Kyle's https://stackoverflow.com/a/32383184/2899559引用 OMP 4.0 标准,其中指出

线程私有变量的所有副本的存储根据静态变量在基本语言中的处理方式被释放,但在程序中的未指定点。

我添加了该类的静态实例(全局和本地)以查看其析构函数是否被调用。对于本地和全球情况来说都是如此。所以问题仍然存在。


这是有记录的行为(尽管我不知道为什么做出这个决定)。

来自MSDN 条目位于threadprivate https://msdn.microsoft.com/en-US/library/2z1788dd.aspx(有一些格式更改):

A threadprivate不保证可破坏类型的变量会调用其析构函数。

...

用户无法控制至于构成并行区域的线程何时终止。如果进程退出时这些线程存在,则线程将不会收到有关进程退出的通知,并且除了退出的线程(此处为主线程)之外的任何线程上都不会为 threaded_var 调用析构函数。所以代码不应依赖于适当的破坏threadprivate变量。

The OpenMP 4.0 版标准 http://www.openmp.org/mp-documents/OpenMP4.0.0.pdf留下order of未指定析构函数调用行为。来自部分12.14.2:

第 151 页,第 7-9 行:

线程私有变量的所有副本的存储根据静态变量在基本语言中的处理方式被释放,但在程序中的未指定点。

第 152 页,第 8-10 行:

类类型的不同 threadprivate 变量的任何构造函数的调用顺序是未指定的。类类型的不同 threadprivate C++ 变量的任何析构函数的调用顺序是未指定的。

就我个人而言,在我看来,微软可能认为这太过分了。析构函数order未指定似乎与未能保证有很大不同at all将调用析构函数。在基本语言(本例中为 C++)中处理静态变量的方式是析构函数保证被称为。所以我认为 MSVC 不符合(不符合 C++ 标准和 OMP 标准),但由于我不是语言律师,所以不要相信我的话。

话虽如此,很难看出这会如何产生严重影响。您当然不应该看到任何内存泄漏,因为threadprivate当线程创建/销毁时,应立即分配/释放存储空间。 (如果你的threadprivate实例引用了非threadprivate他们管理的内存,嗯……这似乎一开始就不起作用。)

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

OMP 线程私有对象未被破坏 的相关文章

  • C# 打印问题(RichTextBox)

    我想打印我的 RichTextBox eintragRichTextBox 的内容 我现在有这个代码 private void druckenPictureBox Click object sender EventArgs e PrintD
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • std::call_once 可重入且线程安全吗?

    std call once http en cppreference com w cpp thread call once是线程安全的 但它也是可重入的吗 我使用 VS2012 调试和发布 进行的测试表明 调用std call once从单
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 使用 LINQ 更新 IEnumerable 对象的简单方法

    假设我有一个这样的业务对象 class Employee public string name public int id public string desgination public int grade List
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters

随机推荐

  • 已达到 Google App Engine 前端实例时间限制

    我有一个使用 Google App Engine 免费选项托管的静态 html 网站 我没有任何流量可言 因为它是新网站 唯一的流量是我自己访问该网站 我注意到 只有 15 个主页请求 我的前端实例消耗时间为 5 按照这个速度 我的网站每天
  • 如何在Tableau中显示40+列?

    我正在尝试制作一份包含大约 40 列 Dims measure 的列表报告 但无法正确完成 该要求推动了Tableau通过利用其仅 16 列的限制来限制 我怎样才能完成这件事 我读了这个 http www tableausoftware c
  • Dot:如何用黑色轮廓装饰图形节点,同时用另一种颜色填充?

    我需要格式化点图的帮助 为了简化我的问题 我在这里有一个点代码 我通过点工具运行它 digraph G TestNode label Test Node shape egg style filled color yellow 结果是这样的
  • HTTParty 的内存问题和下载大文件

    这会导致 Ruby 的内存问题吗 我知道如果大小超过 10KB Open URI 就会写入 TempFile 但是 HTTParty 会在写入 TempFile 之前尝试将整个 PDF 保存到内存中吗 src Tempfile new fi
  • 调整 WriteableBitmap 的大小

    我创建了 Gray16 格式的 WriteableBitmap 我想将此 WriteableBitmap 调整为我已知的尺寸 并保留像素格式 Gray16 是否有人致力于调整 WriteableBitmap 的大小 请帮我 我也在网上搜索了
  • queryselectorAll() 与正则表达式属性选择器

    var arr slice call document querySelectorAll a href pricing 返回一个长度为 6 的数组 var arr slice call document querySelectorAll a
  • 访问 SimpleXMLElement 中的数字属性

    我正在尝试访问以下元素中的数字 但无法从中获取值 echo object gt 0 returns Parse error syntax error unexpected T LNUMBER expecting T STRING or T
  • Maven:POM 模块和子模块层次结构

    我的项目结构如下 module pom xml submodule pom xml pom xml POM 简化 Project
  • 如何使用字符串创建 JSON 对象?

    我想使用 String 创建一个 JSON 对象 例子 JSON test1 value1 test2 id 0 name testName 为了创建上面的 JSON 我使用了它 String message JSONObject json
  • 将多个 javascript 文件合并为一个的工具... [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有一种工具可以将多个javascript文件合并为一个然后压缩它们 雅虎 YUI 压缩器 http developer yahoo c
  • 相同的选择菜单列表项切换

    我正在尝试开发一个涉及 2 个选择列表项的功能 流程是这样的 有两个列表项 相同 具有相同的列表项 当我选择一个选项时Main Tags列表 相同的选项Sub Tags列表应该被禁用 例如 如果我选择Tag 1来自Main Tags然后列出
  • cLion + Qt5 - 退出代码 -1073741515 (0xC0000135)

    我正在尝试使用 QT5 和 cLion 运行简单的测试 但我遇到了退出代码墙 这是我的环境 克狮2017 2minGw 5 0 cMake 3 8 2Qt 5 9 0 CMakeList txt cmake minimum required
  • 从列表中删除项目有困难吗?

    我有两个清单 第一个是所有学生 第二个是选定的学生 我希望如果我一次选择某个学生 他们将从所有学生列表中删除 这是我的代码 但事实并非如此 学生不会被开除 foreach var li in ListSelectedStudents ToL
  • 将 json 数组读入 SQL Server 中的行

    给定下面的示例 json 数据 我如何编写一个查询来一步提取数组数据 我的目标是 ActionRecs 数组 4 中的每一项都占一行 我的实际 json 更复杂 但我认为这给出了我的目标的一个很好的例子 declare json2 nvar
  • 在 Pandas 数据帧上循环时跳过行

    我正在努力解决以下问题 并且似乎在网上找不到任何解决方案 我对数据框有一个 for 循环 该循环应该执行以下操作 如果 reversal 列的内容 1 则用 1 填充 action 列 跳过 125 行 用 1 填充 action 的下一个
  • 如何卸载 Visual Studio 2012 Update 2?

    我安装了 VS2012 然后更新到 VS2012 Update 2 因此我的 Visual Studio 版本为 11 0 60315 01 Update 2 但现在我想恢复到 11 0 50727 1 RTMREL 如何卸载更新 Visu
  • 将系统属性传递给spark-submit并从类路径或自定义路径读取文件

    我最近发现一种使用 logback 代替 log4j 的方法 https stackoverflow com a 45480145 1549135在 Apache Spark 中 既适合本地使用 也适合spark submit 然而 还缺少
  • HttpServlet 类中的“service”方法是什么?

    下面是为了学习而编写的一个简单的servlet package com example tutorial import java io IOException import java io PrintWriter import javax
  • Elasticsearch 中的嵌套查询

    我在使用 elasticsearch 进行嵌套查询时遇到问题 如果我删除其中一个查询字符串 它就可以工作 我试图解决的问题是我有一个包含闭包列表的文档 闭包 我想在闭包列表中搜索一个值 其中另一个值满足某个条件 这只是从 argan 1 的
  • OMP 线程私有对象未被破坏

    底线 如何确保 threadprivate 实例被正确销毁 背景 接听时这个问题 https stackoverflow com questions 32347008 confused about firstprivate and thre