在多线程进程上调用fork

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (171)

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

提问于
用户回答回答于

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

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

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

理由部分(在链接页面的下方)说:

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

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

所属标签

可能回答问题的人

  • 学生

    3 粉丝476 提问7 回答
  • uncle_light

    5 粉丝518 提问6 回答
  • 最爱开车啦

    8 粉丝503 提问5 回答
  • 骑牛看晨曦

    4 粉丝522 提问5 回答

扫码关注云+社区

领取腾讯云代金券