2010-04-03 52 views
4
子进程的数据共享

我的问题是有点概念,如何与由fork()电话或通过pthread_create()并行线程和用C

例如创建一个线程创建子进程共享父进程的数据,直接的全局变量传递给子进程,如果是的话,对父进程中的子进程效果值所做的该变量进行修改?

我欣赏的部分和完整的答案提前,如果我错过任何现有的资源,我很抱歉,我已经做了谷歌一些搜索,但未能再次找到了良好的效果

谢谢您时间和答案

回答

5

fork()和pthread_create()的语义有些不同。

fork()将创建一个新的进程,其中全局变量将在父进程和子进程之间分开。大多数操作系统实现都将使用写时复制语义,这意味着父进程和子进程都将为所有全局变量使用相同的物理内存页面,直到其中一个进程尝试编辑物理内存为止,页面,所以现在每个进程都有自己的副本,并且没有看到其他进程,所以进程是孤立的。

pthread_create()另一方面,在同一个进程中创建一个新线程。新线程将与同一进程的其他正在运行的线程有单独的堆栈空间,但全局变量和堆空间在同一进程的所有线程之间共享。这就是为什么你经常需要一个互斥体来协调对同一进程的多个线程之间的共享内存段的访问。

TL; DR版本:用fork(),你看不到其他人的变化;用你做的pthread_create()。

2

fork创建调用进程的几乎精确副本,包括内存和文件描述符。全局变量与其他所有内容一起被复制,但它们不以任何方式链接到父进程。由于文件描述符也被复制,所以父和子可以通过这些进行交互(只要它们设置正确,通常通过管道或套接字对)。

+0

如何处理这种情况,我有一个int *在父进程中,当分叉时,它指向地址5的某个地方,子副本会指向同一个地方吗?修改也会在父进程中生效 – besamelsosu 2010-04-03 10:03:27

+0

否。复制整个内存映像。无论它是一个变量还是一些未公开的内存片段都无关紧要。 – 2010-04-03 10:06:03

1

fork创建的流程与pthread_create创建的流程之间存在很大差异。进程不共享全局变量,并且应该通过管道,套接字或OS提供的其他工具进行通信。 MPI是一个很好的解决方案,它是一个用于进程间通信的消息传递库。

线程是完全不同的。使用pthread_create创建的线程与其调用者共享所有全局变量。而且,调用者可以将任意结构传递给线程,并且该结构也将被共享。这意味着在使用线程进行编程时应该非常小心 - 这种共享数量很危险并且容易出错。 pthread API为线程之间的健壮同步提供了互斥体和条件(虽然它仍然需要实践和专业知识才能正确实现)。