了解 OpenMP 有关 fork 的缺点

2024-01-28

我想了解它们在这里的意思。为什么这个程序会“挂起”?

From https://bisqwit.iki.fi/story/howto/openmp/ https://bisqwit.iki.fi/story/howto/openmp/

OpenMP 和fork()值得一提的是,在 调用的程序fork()需要特别考虑。这 问题仅影响 GCC;国际刑事法院不受影响。如果你的程序 打算成为后台进程使用daemonize()或其他 类似的意思是,您不得使用分叉之前的 OpenMP 功能。 使用 OpenMP 功能后,仅在以下情况下才允许分叉: 子进程不使用 OpenMP 功能,或者它作为 全新的流程(例如之后exec()).

这是一个错误程序的示例:

#include <stdio.h>   
#include <sys/wait.h>   
#include <unistd.h>

void a(){
    #pragma omp parallel num_threads(2)
    {
        puts("para_a"); // output twice
    }
    puts("a ended"); // output once   
}

void b(){
    #pragma omp parallel num_threads(2)
    {
        puts("para_b");
    }
    puts("b ended");   
}

int main(){    
    a();   // Invokes OpenMP features (parent process)   
    int p = fork();    
    if(!p){
        b(); // ERROR: Uses OpenMP again, but in child process
        _exit(0);    
    }    
    wait(NULL);    
    return 0;   
}

运行时,该程序挂起,永远不会到达输出“b 已结束”。目前没有解决方法,因为 libgomp API 没有 指定可用于准备调用的函数fork().


发布的代码违反了 POSIX 标准。

The POSIX fork()标准状态 http://pubs.opengroup.org/onlinepubs/9699919799/functions/fork.html:

应使用单个线程创建进程。如果是多线程 进程调用 fork(),新进程应包含该进程的副本 调用线程及其整个地址空间,可能包括 互斥体和其他资源的状态。因此,为了避免 错误,子进程只能执行异步信号安全 操作,直到其中之一exec函数被调用。

运行 OMP 并行化代码显然违反了上述限制。

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

了解 OpenMP 有关 fork 的缺点 的相关文章

  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 无法获取本地或参数的值,因为它在此指令指针处不可用,可能是因为它已被优化掉

    Visual Studio 2010 会删除 没有其他词 不安全块中函数参数之一中的数据 什么可能导致此错误 调试器显示以下消息 Cannot obtain value of local or argument as it is not a
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • 在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

    Qt 5 1 或更高版本 我需要播放频率为 x 的通知声音 n 毫秒 如果我能像这样组合音调那就太好了 1000Hz 持续 2 秒 然后 3000Hz 持续 1 秒 最简单的方法是使用文件 WAV MP3 例如如此处所述 如何用Qt播放声音
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 不使用放置 new 返回的指针时的 C++ 严格别名

    这可能会导致未定义的行为吗 uint8 t storage 4 We assume storage is properly aligned here int32 t intPtr new void storage int32 t 4 I k
  • 当 Verb="runas" 时设置 ProcessStartInfo.EnvironmentVariables

    我正在开发一个 C 应用程序 我需要创建变量并将其传递给新进程 我正在使用ProcessStartInfo EnvironmentVariables 新进程必须提升运行 因此我使用 Verb runas var startInfo new
  • 使用 IdentityDbContext 和 Code First 自动迁移表位置和架构的实体框架?

    我正在尝试使用 IdentityDbContext 类设置自动迁移更新 并将更改传播到整个数据库的实际 DbContext 在进入代码之前 在使用自动迁移实现 IdentityDbContext 时 我收到此错误 影响迁移历史系统表位置的自
  • 如何在 Razor 编辑视图中显示选中的单选按钮 Asp net core mvc

    尽管 Razor 视图中的 Asp 网络核心代码 model List
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • 使用 Typescript 导入 Electron 类

    如何将 Electron 类导入 Typescript 文件 以便智能感知正常运行 例如 我想把这个 var BrowserWindow require browser window var app require app app on r
  • 在单独的进程上运行 Goroutines(多处理)

    我目前有一个 MQTT 代码 可以订阅主题 打印收到的消息 然后向新主题发布进一步的指令 这订阅 打印在一个 Goroutine 中完成 并且出版是在另一个 Goroutine 中完成的 这是我的代码 var wg pg sync Wait
  • .net 中的数据类型和 C# 中的数据类型哪一种更快? [复制]

    这个问题在这里已经有答案了 大家好 首先我很抱歉 因为我的母语不是英语 我想了解 C 数据类型和 net 数据类型哪一种更快 我尝试通过下面的代码来理解 我认为 net 数据类型更快 这是正确的吗 我在 x86 和 x64 平台上测试了这段
  • 在Spring中正确使用Log4jConfigurer

    在我们的应用程序中 我们决定将 log4j 配置文件命名为自定义名称 以避免无意中从另一个 jar 加载默认文件 为了配置它 我们使用org springframework util Log4jConfigurer指定 log4j 位置
  • 在 Windows Phone 8.1 中以编程方式检测重新启动

    我有一个 WP 8 1 运行时 它启动了DeviceUseTrigger后台任务 问题是 每当手机重新启动时 该任务显然会取消 但任务注册仍然存在 所以当我下次启动我的应用程序时后台任务appears在现实没有跑步的情况下跑步 我想要某种方
  • 延迟脚本加载

    所以如果我有以下内容 我只是想延迟使用 settimeout 调用该文件的执行 我该怎么做 很奇怪的是 我在一个简单的函数上使用 settimeout 没有问题 但我在这个看似更简单的情况下有点困惑 我的想法是我可以创建一个在 x 时间后调
  • Apache Camel Java DSL 在正文中添加换行符

    因此 我在 Java DSL 中设置了一个 netty4 套接字路由 如下所示 Override public void configure throws Exception String dailyDataUri SOCKET daily
  • AWS 工作层 cron - 服务器错误 #500 - “发布 http 1.1 500 AWS aws-sqsd/2.0”

    我正在尝试在 Elastic Beanstalk 上设置一个 cronjob 任务正在安排中 出于测试目的 它应该每分钟运行一次 但是它不起作用 这是一个 Django 应用程序 该应用程序在两个环境中运行 一个是工作环境 另一个是 托管
  • Flutter - 检测充满其他小部件的屏幕上的点击

    我正在尝试检测屏幕上的点击 我尝试过使用的多种变体GestureDetector但这只会导致应用程序检测到点击子元素 and 不是屏幕 这是代码 class QQHome extends StatelessWidget override W
  • 如何平滑徒手绘制的 SVG 路径?

    我正在寻找一种解决方案 将由大量 auf LineTo 段组成的手绘 用户绘制的 SVG 路径转换为更平滑的路径 首选语言是 JavaScript 但欢迎任何建议 首先 我建议使用一个好的图形库 例如raphael 它将简化实际使用 jav
  • iOS 8 横向:键盘无法正确显示

    我有一个为 iOS8 编译的应用程序 该应用程序在项目设置中设置为仅允许纵向 根据设计 应用程序的视图不会旋转为横向 在 iOS7 中 当您旋转设备以横向时 键盘不会旋转 这是我想要的行为 但是 在 iOS8 中 当您将设备旋转到横向时 键
  • 使用 RecyclerView 适配器更新数据的最佳方法[重复]

    这个问题在这里已经有答案了 当我必须使用经典适配器时ListView https developer android com guide topics ui layout listview html 我在 ListView 中更新数据 如下
  • inno-setup 脚本中的可选组件和类型

    我创建了以下 InnoSetup 脚本 用于添加可选组件 遵循此 StackOverflow 答案的建议 Inno Setup 正确使用 类型 组件 和 任务 https stackoverflow com questions 889082
  • 获取额外数据透视表列的值 laravel

    我有一个phone models phone problems 和一个phone model phone problem 数据透视表 数据透视表有一个额外的列 价格 手机型号 class PhoneModel extends Eloquen
  • 图像不会出现在闪亮应用程序的 www 文件夹中

    我正在遵循上一个问题中的代码 R Shiny 将图片添加到带有文本的流体行中的框 https stackoverflow com questions 44279773 r shiny add picture to box in fluid
  • 让 Fortran 中的函数返回一个可以放置在赋值左侧的引用

    正如标题所述 我想要directly修改我通过从函数检索的指针访问的数据 函数返回的引用出现在 l h s 上 赋值 在 C 中没有问题 但 Fortran 中的以下最小示例会出错 module test mod implicit none
  • NHibernate SysCache 是否可以在非 Web 应用程序中工作?

    我知道 SysCache 在底层使用 ASP 缓存 但由于我不知道 ASP 缓存的实现 以及它是否依赖于 IIS 我想知道 SysCache 是否可以在非 Web 应用程序中工作 例如Windows 服务 激活它并使用 NHprofiler
  • 我们如何在不下载 EXSLT 源代码的情况下使用 EXSLT?

    XSLTSL http xsltsl sourceforge net id1954375似乎声称我们可以使用 EXSLT 而无需下载其源代码 直接从图书馆网站导入或包含主样式表或您希望使用的样式表模块 http xsltsl sourcef
  • 子查询未连接到主查询

    下面的查询用于从数据库中检索记录以在报告中显示 但 SENOKO AND EUNOS 专栏显示复制每行总计 这似乎是子查询未连接到主查询导致没有进行过滤 SELECT whbal customer customer imp license
  • 了解 OpenMP 有关 fork 的缺点

    我想了解它们在这里的意思 为什么这个程序会 挂起 From https bisqwit iki fi story howto openmp https bisqwit iki fi story howto openmp OpenMP 和fo