我对在多线程进程上使用fork有疑问。如果一个进程有多个线程(已经使用pthread_create创建并创建了一个pthread_join),我调用了fork,它会复制子进程中分配给线程的相同函数,还是会创建一个空间,让我们可以重新分配这些函数?
发布于 2018-12-04 04:21:43
仔细阅读POSIX对fork()
和线程的描述。特别是:
fork()
,则新进程应包含调用线程的副本及其整个地址空间,可能包括互斥和其他资源的状态。因此,为了避免错误,子进程只能执行异步信号安全操作,直到调用其中一个exec函数。子进程将有一个线程在调用线程的上下文中运行。原始进程的其他部分可能会被不再存在的线程占用(例如,互斥锁可能会被锁定)。
基本原理部分(进一步向下链接页面)说:
POSIX程序员之所以调用fork()
,有两个原因。一个原因是在同一个程序中创建一个新的控制线程(最初只有通过创建一个新进程才能在POSIX中实现);另一个原因是创建一个运行不同程序的新进程。在后一种情况下,调用fork()
之后不久就会调用其中一个exec
函数。
让fork()
在多线程环境中工作的一般问题是如何处理所有线程。有两种选择。一种是将所有线程复制到新进程中。这会导致程序员或实现处理在系统调用时挂起的线程,或者可能要执行不应在新进程中执行的系统调用的线程。另一种方法是只复制调用fork()
的线程。这就造成了一个困难,即进程本地资源的状态通常保存在进程内存中。如果未调用fork()
的线程持有资源,则子进程中永远不会释放该资源,因为子进程中不存在其任务是释放该资源的线程。
当程序员编写多线程程序时,pthread_create()
函数提供了fork()
的第一个用法,即在同一程序中创建新线程。因此,fork()
函数仅用于运行新程序,并且在对fork()
的调用和对exec函数的调用之间调用需要特定资源的函数的效果是未知的。
https://stackoverflow.com/questions/53601200
复制相似问题