当前位置: 首页 > 面试题库 >

线程分叉时会发生什么?

欧阳勇
2023-03-14
问题内容

我知道fork() sys_call从线程调用是一个坏主意。但是,如果线程使用创建新进程,将会发生什么fork()

新进程将是创建线程的主线程的子进程。我认为。

如果其父级先完成,则新进程将附加到init进程中。它的父级是主线程,而不是创建它的线程。

如果我错了,请纠正我。

#include <stdio.h>
#include <pthread.h>

int main () 
{
     thread_t pid;
     pthread_create(&(pid), NULL, &(f),NULL);
     pthread_join(tid, NULL);
     return 0;
}

void* f()
{
     int i;
     i = fork();

     if (i < 0) {
         // handle error
     } else if (i == 0) // son process
     {
          // Do something;
     } else {
          // Do something;
     }
 }

问题答案:

新进程将是创建线程的主线程的子进程。我认为。

fork创建一个新的过程。一个进程的父进程是另一个进程,而不是线程。因此,新流程的父级是旧流程。

请注意,子进程将只有一个线程,因为它fork仅复制调用的(堆栈)线程fork。(这不是完全正确的:整个内存都是重复的,但是子进程将只有一个活动线程。)

如果其父级先完成,则新进程将附加到init进程中。

如果父母先完成,SIGHUP则向孩子发送信号。如果孩子没有因此而退出,SIGHUP它将init作为其新父母。有关nohupsignal(7)的更多信息,请参见手册页SIGHUP

它的父级是主线程,而不是创建它的线程。

进程的父级是进程,而不是特定的线程,因此说主线程或子线程是父级是没有意义的。整个过程是父母。

最后一点:混合线和叉必须小心。



 类似资料:
  • 我的程序每次要处理某件事情时都会分叉,在每个分叉进程中,我都分离一个线程,以便从分叉进程中记录统计数据:这个线程循环收集数据,但它没有停止这个循环的实际条件。 程序的输出证实了每一个线程都随其工艺而死 当我使用运行这个程序时,引起了一些疑问:当每个分叉进程死亡时,会显示一些令人毛骨悚然的输出(13534是分叉进程PID): 相同的错误(警告?)每个分叉进程死亡时的消息。

  • 问题内容: 线程启动后,如果该线程的引用设置为,那么该线程将如何处理?会停止吗?它有资格获得GC吗? 像这样: 问题答案: 实时线程将继续运行,即使其引用设置为null。 就像任何其他对象一样,当没有任何引用时,它就有资格使用GC。棘手的一点是,即使您的程序未保留一个 正在运行的线程 在ThreadGroup中的引用,因此 也永远不会 对 正在运行的线程进行GC。

  • 来自文档:http://docs.python.org/2/library/thread 让我们在这里只讨论非守护进程线程。因为第一个引号没有特别提到非守护进程线程,所以我假设,如果主线程退出,即使是非守护进程线程也应该被杀死。然而,第二句引文却表明了另一种情况。事实上,当主线程退出时,非守护进程线程确实不会被杀死。那么,这里的第一个引用有什么意义呢?

  • 问题内容: 我们有多个线程调用上。 我的理论是,当由两个线程同时调用时,实际上仅将要添加的两个对象之一添加到。这看似合理吗? 如果是这样,您如何解决呢?使用类似吗? 问题答案: 对于ArrayList上的两个线程同时调用add时发生的情况,没有任何保证的行为。但是,根据我的经验,两个对象的添加都很好。与列表相关的大多数线程安全问题在添加/删除时都会处理迭代。尽管如此,我强烈建议不要将Vanilla

  • 问题内容: 在某个线程上调用an 时,该线程会发生什么? 问题答案: 目标线程是“中断的”。通常,在该线程中设置一个标志,该线程可以查看该标志(带有)。如果目标线程当前在某些I / O上被阻塞,则分别使用an 或an 唤醒它。 线程中断是微调线程的一种温和方法。它是用来给线程有机会退出 干净 ,而不是,这更像是一支突击步枪射击的线程。

  • 我注意到,在这个javadoc中,https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.htmlUncaughtExceptionHandler用于发生异常但未被捕获的情况。但是,那个线程会悄悄地失败吗?我想是的,因为它是异步进行业务的,但我正在调查我们的一个进程的相关问题,我很惊讶现