gpt4 book ai didi

c++ - 如何将 OpenMP 部分转换为 fork()

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:15 38 4
gpt4 key购买 nike

我是 pthreads 的新手,想问一下如何表达这样的东西:

while(imhappy())
{
#pragma omp sections
{
#pragma omp section
{
dothis();
}
#pragma omp section
{
dothat();
}
}
}

在使用 fork() 或 vfork() 的等效结构中?先谢谢了!

PS:我在这些部分周围加入了 while 以防由于某些资源克隆而在进入循环之前以某种方式更聪明地 fork

最佳答案

OpenMP 在幕后做了很多其他事情,而不仅仅是生成线程。它还分发代码段并同步不同的线程。您已将您的问题标记为 pthreads,尽管您询问的是使用 fork() 的实现,这令人困惑。在 Linux 中,fork() 非常重量级,因为它创建新进程,而 clone() 用于创建线程。

然而,具有两个线程的 OpenMP sections 构造的粗略等效是 fork ,之后必须遵循 if 构造并且主进程将执行 dothis() 路径,而 child 将执行 dothat() 路径。 fork() 的返回值在父进程和子进程中是不同的,可用于做出分支决策。然后,父进程将等待子进程使用 waitpid() 完成,这类似于 omp sections 区域末尾的隐式屏障同步。

但有一个警告 - fork() 是使用 COW(写时复制)页面实现的。它的意思是,虽然一开始子进程的内存内容与父进程的内存内容相同,但所做的任何更改都是私有(private)的——子进程不会在自己的内存中看到父进程修改的内容,反之亦然。必须使用 SysV 共享内存原语或共享文件映射在两者之间显式共享内存。

您可能真的想研究使用 POSIX 线程 API。

vfork() 是为完全不同的目的而设计的系统调用,根本不适合进程克隆。

关于c++ - 如何将 OpenMP 部分转换为 fork(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10732927/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com