C中的pthread和子进程数据共享

时间:2010-04-03 09:53:50

标签: c scope pthreads fork data-sharing

我的问题在某种程度上是概念性的,如何通过fork()调用或pthread_create()

创建的线程创建父进程的数据与子进程共享 例如,是否将全局变量直接传递给子进程,如果是这样,那么子进程对该变量进行修改会在父进程中对其进行效果吗?

我提前感谢部分和完整的答案,如果我缺少任何现有资源,对不起,我已经在谷歌上做了一些搜索但是找不到好的结果

再次感谢您的时间和答案

3 个答案:

答案 0 :(得分:5)

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

fork()将创建一个新进程,其中全局变量将在父进程和子进程之间分开。大多数OS实现都将使用写时复制语义,这意味着父进程和子进程都将对所有全局变量使用相同的物理内存页,直到其中一个进程尝试编辑物理内存,此时副本页面已经生成,因此现在每个进程都有自己的副本,并且看不到其他进程,因此进程是隔离的。

另一方面,

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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