2

I am new to pthreads and would like to ask how to express something like:

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

in an equivalent construct using fork() or vfork() ? Thanks ahead!

PS: I included the while around the sections in case it is somehow more clever to fork before the entering the loop due to some resource cloning.

4

2 回答 2

2

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

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

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

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

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

于 2012-05-24T11:24:15.800 回答
0

我不认为使用叉子可以直接模拟部分。但是,理论上您可以使用消息传递机制来模拟它,其中共享变量与根计算机一起保存。所有的 openMP 刷新都将使用 root 进行。(请记住,openMP 使用弱于弱一致性模型)。

于 2012-05-24T17:28:33.347 回答