首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在多线程进程上调用fork

在多线程进程上调用fork
EN

Stack Overflow用户
提问于 2018-12-04 04:15:43
回答 1查看 1.2K关注 0票数 1

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-04 04:21:43

仔细阅读POSIX对fork()和线程的描述。特别是:

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

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

基本原理部分(进一步向下链接页面)说:

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

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53601200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档