多平台多进程?

3
我在想为什么新的C++11中添加了线程而不是进程。
他们不能围绕平台特定的功能做一个包装器吗?
关于最可移植的多处理方式,有什么建议?fork()? OpenMP?

3
既然您已经有了许多线程,为什么不将这些线程视为进程呢?似乎在这里有一个误解,因为您提出的替代方案(pthreads 和 openmp)都是线程而不是进程。您可能混淆了线程模型和进程吗?请注意,在翻译时我未做解释或更改原意。 - Flexo
@awoodland:哦,你说得对,我是指fork()家族,而不是pthread。我还没有看过OpenMP;从它的名字来看,它似乎是关于多处理的。 - Pietro
1
OpenMP通常映射到pthread或系统线程API。OpenMPI将根据情况使用进程或线程,并将该细节隐藏起来。 - Flexo
2
OpenMP是一种共享内存多处理的标准。单个操作系统实例中的不同进程在它们自己的虚拟地址空间中被隔离,因此超出了OpenMP的范围。对于进程级别的多处理,已经有了具有良好API的MPI - 没有必要重新发明轮子或使其变成正方形。 - Hristo Iliev
2
最小支持的原因是目标日期是2008/2009(C++0x,对吧?),在那个时间段内没有足够的时间来开发一个更有雄心壮志的库。 - Bo Persson
3个回答

3
如果您想要实现可移植性,建议避免直接调用fork(),而是编写自己的库函数,可以在支持fork()exec()组合的系统上进行映射。如果您小心谨慎,可以使您的函数具有与Win32上的CreateProcess()相同或类似的语义。
与基于Windows的系统相比,UNIX系统在进程和进程管理方面往往采用非常不同的方法,因此除了最简单的包装器之外,要使所有包装器都具有可移植性是不容易的。
当然,如果您有C++11或Boost可用,我建议您使用它们。如果您没有任何全局变量(这通常是一个好习惯),也没有其他设置和共享数据的方式,那么在现代系统上,线程和进程之间的实际差异很小。您创建的所有线程都可以像进程一样独立地进行进展。
如果以上方法都无法满足您的需求,您可以考虑使用MPI实现消息传递,或者使用批处理调度程序系统。

现代系统中线程和进程之间的实际差异很小。嗯,所有线程共享同一内存段这个事实应该是相当基本的区别,不是吗? - Pietro
1
@Pietro - 如果地址空间的每个部分只被一个线程触及,那么它类似于拥有独立的进程。你引用的语句的“背景”是,fork()pthread_create()在Linux上映射到相同的底层系统调用(clone()),因此在某个层面上它们是不可区分的。即使非常传统的进程也会有共享内存段,用于加载他们所共享的对象(映射为读/执行模式)。 - Flexo

3
如果您可以使用Qt,QProcess类可以是一种优雅的跨平台解决方案。

0

我正在使用Boost Interprocess

它不提供创建新进程的可能性,但一旦它们存在,它允许它们进行通信。

在这种特殊情况下,我可以从shell脚本中创建所需的进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接