在 Openmp (C++) 中销毁线程

2023-12-05

是否可以销毁 OpenMP 创建的线程?当程序启动时,只有一个线程。在并行化部分之后,由于存在线程池,因此仍保留多个线程。并行部分运行后有什么方法可以销毁这个池吗?

我问是因为我在动态库中使用 OpenMP,并且在线程运行时无法关闭库句柄(程序将出现段错误)。

Thanks

更多解释:我将所有并行化代码放入模块(共享库)中。然后,我加载该模块并向其传递一个从抽象基类派生的类。然后该模块并行“运行”该类。这样,我就可以不使用并行化、OpenMP、MPI 或其他任何东西,并且可以在运行时甚至即时更改并行方案。但 OpenMP 不会破坏线程,当需要手动 dlclose 库时,它会出现段错误,因为资源是从线程下面破坏的(我相信)。现在让程序完成而不关闭库可能是可以的,但是将来可能仍然会出现想要手动关闭库的情况(考虑动态更改方案)。希望这是有道理的:) 谢谢


目前,OpenMP 规范没有为用户提供任何控制线程何时被销毁的能力。您所说的内容非常有趣,并且在任何 OpenMP 语言委员会讨论规范的会议上都没有被提及。您能否提供更多有关您正在做的事情以及问题所在的信息?将这一讨论提交给委员会将会有所帮助。

编辑添加 3/7 -

好的 - 这是一个似乎有效的简单示例,它可能会解决您的问题:

$> cat prog.c  
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int main(void)
{
  void (*f)(void);
  void *handle;

  handle = dlopen("./shared.so", RTLD_NOW);
  if (!handle) {
    printf("*** dlopen error - %s\n", dlerror());
    abort();
  }

  f = dlsym(handle, "foo");
  if (!f) {
    printf("*** dlsym error - %s\n", dlerror());
    abort();
  }
  f();

  if(dlclose(handle)) {
    printf("*** dlclose error - %s\n", dlerror());
    abort();
  }
  return 0;
}

$> cat shared.c 
#include <omp.h> 
#include <stdio.h>

void foo(void)
{
  int i;

  puts("... in foo\n");

  #pragma omp parallel for
  for (i=0; i<10; i++) 
    printf("t#: %i  i: %i\n", omp_get_thread_num(), i);

  puts("... exiting foo");
}

$> gcc -rdynamic -fopenmp prog.c -ldl -o prog                                                                   
$> gcc -c -fopenmp -fPIC -o shared.o shared.c                                                                 
$> ld -shared -o shared.so shared.o                                                                           
$> ./prog
... in foo

t#: 2  i: 4
t#: 2  i: 5
t#: 3  i: 6
t#: 3  i: 7
t#: 0  i: 0
t#: 0  i: 1
t#: 4  i: 8
t#: 4  i: 9
t#: 1  i: 2
t#: 1  i: 3
... exiting foo

虽然主程序 (prog.c) 中没有 OpenMP 代码,但我使用 -fopenmp 标志对其进行编译。这意味着将在调用实际使用 OpenMP 的共享库之前设置 OpenMP 环境。这似乎解决了执行 dlclose 的问题,因为环境仍然存在。它还允许首次使用 OpenMP 获得的线程保留下来以供后续使用。这是否可以解决您的问题(或者这仅适用于这个简单的示例)?

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

在 Openmp (C++) 中销毁线程 的相关文章

随机推荐

  • 即使手机处于锁定模式,活动也会显示

    我的问题与此类似如何让 Android 设备启动并跳过屏幕锁定 我想从广播接收器显示一个对话框 但 Android API 不允许我这样做 因此我正在使用从那里启动一个活动并将该活动的主题更改为 Theme 现在 即使手机处于锁定模式 睡眠
  • 当我的主选择使用 AJAX 更改时,如何刷新详细选择列表

    我正在寻找一些指示 我有一个包含主题列表的选择列表
  • Haskell:如何将多个实例放在同一个模块中?

    假设我有以下代码 import Data List Ordered data Person Person String String deriving Show Eq main IO main print show sort Person
  • CSS 伪类与 jQuery

    我刚刚学了一点 jQuery 并尝试用它来实现简单的变色效果 假设我有两个 div s foo 和 bar foo 有很多 URL 并且定义了以下 CSS foo a color blue border bottom 1px dashed
  • 使用 PDO 发送空值会导致错误

    我们有类似以下 PDO 语句 用于与 PostgreSQL 8 4 DB 进行通信 st db gt prepare INSERT INTO Saba Betriebskosten personalkosten VALUES kd pers
  • 捆绑已关闭,但我仍然想要版本控制

    我在 MVC4 中使用捆绑 或者更确切地说我was使用捆绑但不得不将其关闭 这意味着脚本和样式链接仅呈现在单独的行上 并且没有版本字符串以确保浏览器在有更新时下载最新文件 我尝试在捆绑代码中添加版本字符串 但随后收到一条错误消息 指出路径无
  • 如何在 Swift 中检查 Documents 目录中是否存在文件?

    如何检查文件是否存在于Documents目录中Swift 我在用 writeFilePath 方法将图像保存到文档目录中 我想在每次启动应用程序时加载它 但如果没有保存的图像 我有一个默认图像 但我就是不知道如何使用 func fileEx
  • 在单个数组对象上重写 toString() Javascript

    我有以下内容 var version 0 3 0 Override the version toString method version proto toString function return this join 哪个执行以下操作
  • Ruby on Rails:在哪里定义全局常量?

    我刚刚开始使用我的第一个 Ruby on Rails Web 应用程序 我有很多不同的模型 视图 控制器等等 我想找到一个好地方来保存真正全局常量的定义 这些常量适用于我的整个应用程序 特别是 它们既适用于我的模型的逻辑 也适用于我的观点所
  • Android:如何在双卡手机中使用特定 SIM 卡发送短信?

    我找到了一些code这样做 但它给了我一个异常 尝试在空对象引用上调用虚拟方法 java lang Class java lang Object getClass 我正在使用我的 Moto G 第三代进行测试 以下是代码 如果我遗漏了任何内
  • Prolog:将数字拆分为递增整数的序列

    在大学里做了一些 Prolog 并做了一些练习之后 我决定进一步深入 尽管我必须承认我不太了解递归 我明白了概念和想法 但如何编码它对我来说仍然是一个问题 所以这就是为什么我很好奇是否有人知道如何帮助解决这个问题 这个想法有一个数字 例如4
  • 在不同目录中找到 SQLite 数据库

    一般SQLite数据库位于 data data PACKAGE NAME databases DBNAME但我发现数据库在 data user 0 PACKAGE NAME databases DBNAME一台设备中的路径 那么 为什么在单
  • 男孩的 htaccess 301 重定向

    我需要有关 httaccess 重写规则的帮助 我的一位客户说 网站 abc com 应该仅将来自 google bing 和 yahoo 搜索引擎机器人的流量 带有 301 重定向 发送到 cba com 否则显示 index html
  • 显示或重定向 shell 的作业控制消息

    TL DR 所有作业控制 崩溃消息在函数内出现时都会被隐藏 我将在下面详细介绍 但是 Barmar指出可以通过在函数内运行崩溃的二进制文件来重现此问题 例如 crun tmp faulty 1 2 3 我在我的中定义了一个函数 zshrc使
  • 使用 Canvas 创建极地面积图

    我正在尝试使用画布创建极地面积图 http jsfiddle net wm7pwL2w 2 Code var myColor ff0 00f 002 003 004 var myData 10 30 20 60 40 var myRadiu
  • summarise_all 与“n()”函数

    我正在总结 dplyr 中的数据框summarize all 功能 如果我执行以下操作 summarize all mydf list mean mean median median sd sd 我得到了一个包含 3 个变量的小标题 用于我
  • 如何使用java创建一个简单的spark graphframe?

    基本上我是一名 Java 开发人员 现在我有机会从事 Spark 工作 我了解了 Spark api 的基础知识 例如 SparkConfig SparkContaxt RDD SQLContaxt DataFrame DataSet 然后
  • 如何在Python中删除字节顺序标记

    这个问题与我报告的 Stack Overflow API 最近的更改有关here 在这个问题中 我收到了response这似乎可行 但实际上我无法使其发挥作用 这是我的代码 import requests import json url h
  • 如何从 50x3 矩阵创建 50x3 元胞数组。继续只获取带有 50x3 子矩阵的 1x1 元胞数组吗?

    使用此代码 但它一直只给我一个 1x1 元胞数组 mynewcellarray mat2cell oldmatrix 50 3 你应该使用num2cell mynewcellarray num2cell oldmatrix
  • 在 Openmp (C++) 中销毁线程

    是否可以销毁 OpenMP 创建的线程 当程序启动时 只有一个线程 在并行化部分之后 由于存在线程池 因此仍保留多个线程 并行部分运行后有什么方法可以销毁这个池吗 我问是因为我在动态库中使用 OpenMP 并且在线程运行时无法关闭库句柄 程