我的问题是有些概念性的,如何是父进程与由fork()呼叫或与由pthread_create()创建的线程创建子进程共享的数据

例如,直接传递到子进程,如果是全局变量,不修改由它的子进程效果值在父进程所做的变量?

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

您的时间和答案再次感谢

有帮助吗?

解决方案

fork()和在pthread_create()的语义是有点不同。

叉()将创建一个新的过程,其中该全局变量将是父和儿童之间分开。大多数OS实施将使用写入时复制语义,这意味着,无论是父子进程将使用的所有全局变量相同的物理内存页,直到进程试图修改物理内存中的一个,在这一点的一个副本页制成,以至于现在每个进程都有自己的副本,并没有看到其他进程的,这样的过程是分离的。

在pthread_create()在另一方面,创建在同一进程中一个新的线程。新的线程将有来自同一过程的其它运行的线程,但全局变量和堆空间是同一过程的所有线程之间共享一个单独的堆栈空间。这就是为什么通常需要互斥来协调访问的同一进程的多个线程之间的存储器的共享片。

TL; DR版本:用叉子(),你看不到其他人的变化;与在pthread_create()你怎么做。

其他提示

一个叉创建一个几乎精确调用进程的副本,包括存储器和文件描述符。全局变量与其他内容一起复制,但他们不是在链接到父进程的任何方式。由于文件描述符也被复制,父母和子女可以通过这些相互作用(只要它们是设置不当,通常通过管或socketpair)。

有由fork并用pthread_create创建的线程之间创建的进程之间有很大的区别。进程不共享的全局变量和应通过连接管,或由操作系统提供的其他工具进行通信。一个好的解决方案是MPI - 这是一种消息传递库进程间通信

线程是完全不同的。线程与pthread_create股创造了所有的全局变量调用者。此外,主叫方可以通过一个任意结构入螺纹,这种结构也将被共享。这意味着,线程编程时应该非常小心 - 比如大量的共享是危险的,容易出错。所述pthread API提供互斥和条件线程之间鲁棒的同步(尽管它仍然需要实践和专业知识来正确地实现)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top