4

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

例如,全局变量是否直接传递给子进程,如果是这样,子进程对该变量所做的修改会影响它在父进程中的值吗?

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

再次感谢您的时间和回答

4

3 回答 3

5

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

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

pthread_create() on the other hand, creates a new thread within the same process. The new thread will have a separate stack space from the other running threads of the same process, however the global variables and heap space are shared between all threads of the same process. This is why you often need a mutex to coordinate access to a shared piece of memory between multiple threads of the same process.

TL;DR version: with fork(), you don't see the other guy's changes; with pthread_create() you do.

于 2010-04-03T10:07:38.470 回答
2

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

于 2010-04-03T09:59:06.430 回答
1

由. fork_ pthread_create进程不共享全局变量,应该通过管道、套接字或操作系统提供的其他工具进行通信。一个好的解决方案是 MPI——它是一个用于进程间通信的消息传递库。

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

于 2010-04-03T10:06:16.783 回答