在多线程进程上调用fork

时间:2018-12-03 20:15:43

标签: multithreading operating-system system-calls

我对在多线程进程上使用fork有疑问。 如果一个进程有多个线程(已经使用pthread_create创建并执行了pthread_join)并且我调用fork,它将复制在子进程中分配给线程的相同函数,还是在空间中重新分配这些函数?

1 个答案:

答案 0 :(得分:3)

仔细阅读POSIX关于fork()和线程的内容。特别是:

  
      
  • 应使用单个线程创建一个进程。如果多线程进程调用fork(),则新进程应包含调用线程的副本及其整个地址空间,可能包括互斥体和其他资源的状态。因此,为避免错误,子进程只能执行异步信号安全操作,直到调用exec函数之一为止。
  •   

子进程将在调用线程的上下文中运行一个线程。原始进程的其他部分可能被不再存在的线程所束缚(例如,互斥锁可能被锁定)。

基本原理部分(位于链接页面的下方)说:

  

POSIX程序员调用fork()有两个原因。一个原因是在同一程序内创建一个新的控制线程(最初只能通过创建新进程在POSIX中实现);另一种是创建一个运行不同程序的新进程。在后一种情况下,对fork()的调用很快就会随即对exec函数之一的调用。

     

使fork()在多线程世界中正常工作的普遍问题是如何处理所有线程。有两种选择。一种是将所有线程复制到新进程中。这导致程序员或实现处理挂在系统调用上的线程或可能要执行不应在新进程中执行的系统调用的线程。另一种选择是仅复制调用fork()的线程。这带来了一个困难,即通常将进程本地资源的状态保存在进程内存中。如果未调用fork()的线程拥有资源,则该资源不会在子进程中释放,因为要释放资源的线程在子进程中不存在。

     

当程序员编写多线程程序时,fork()函数提供了对pthread_create()的首次描述使用,即在同一程序中创建新线程。 fork()函数因此仅用于运行新程序,并且在调用fork()和exec函数之间需要某些资源的调用函数的效果未定义。