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

标签 c++ pthreads fork openmp

我是 pthreads 新手,想问一下如何表达如下内容:

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

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

PS:我在这些部分周围包含了 while ,以防由于某些资源克隆而在进入循环之前 fork 更聪明。

最佳答案

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

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

但需要注意的是 - fork() 是使用 COW(写时复制)页面实现的。这意味着,虽然一开始子级的内存内容等于父级的内存内容,但所做的任何更改都是私有(private)的 - 子级不会看到父级在自己的内存中修改的内容,反之亦然。必须使用 SysV 共享内存原语或共享文件映射在两者之间显式共享内存。

您可能真的想考虑使用 POSIX 线程 API。

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

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

相关文章:

c++ - 如何使用 C++ 和 Snow Leopard 使 OpenGL/GLUT 与 Eclipse IDE( cocoa 64 位)一起工作

c - pthread 互斥体在等待时未解锁

C - exec 是否必须在多线程进程中立即跟随 fork?

java - 如何在 DllMain 调用中维护 JVM 指针并防止调用 JNI_CreateJavaVM 两次

c++ - `const T* const` 是什么意思?

c++ - 如何在 C++ 中创建线程机制?

c - 如何使用 Pthreads 并行化我的 n 皇后拼图?

c++ - 在线程应用程序(linux、pthreads)中读取文件大小时出错

c - fork() 和 pipe() 的小问题

c - 执行后台进程并从父级检查状态