我是pthreads的新手,想问一下如何表达:
while(imhappy())
{
#pragma omp sections
{
#pragma omp section
{
dothis();
}
#pragma omp section
{
dothat();
}
}
}
在使用fork()或vfork()的等效构造中? 谢谢你!
PS:我在这些部分中包含了而,以防由于某些资源克隆而在进入循环之前对 fork 更加聪明。
答案 0 :(得分:2)
OpenMP在幕后做了很多其他事情而不仅仅是产生线程。它还分发代码段并同步不同的线程。您已将问题标记为pthreads
,但您询问fork()
的实施情况令人困惑。在Linux中,fork()
非常重要,因为它创建了新进程,而clone()
则用于创建线程。
然而,具有两个线程的OpenMP部分构造的粗略等价物将是fork,之后必须遵循if
构造,并且主进程将在子进程执行时执行dothis()
路径dothat()
路径。来自fork()
的返回值在父进程和子进程中是不同的,可用于为分支做出决策。然后,父进程将等待子进程以waitpid()
结束,这类似于omp sections
区域末尾的隐式障碍同步。
但有一点需要注意 - fork()
是使用COW(写时复制)页面实现的。这意味着虽然在开始时子项的内存内容等于父项的内存内容,但所做的任何更改都是私有的 - 子项不会看到父项在其自己的内存中修改的内容,反之亦然。必须使用SysV共享内存原语或共享文件映射在两者之间显式共享内存。
您可能真的想要考虑使用POSIX线程API。
vfork()
是一个系统调用,专为完全不同的目的而设计,根本不适合进程克隆。
答案 1 :(得分:0)
我认为使用fork没有直接模拟部分。 但是,理论上可以使用messgae传递机制来模拟它,其中共享变量与根机器保持在一起。所有openMP刷新都将使用root进行。 (请记住,openMP使用弱于弱一致性模型)。