我有点困惑我想详细了解,如果有多个线程的C程序创建新进程会发生什么。行为是否取决于创建新进程的线程或创建新进程的线程数?
答案 0 :(得分:4)
使用pthreads,调用fork
时,只有调用线程在新进程中分叉。
子进程是使用单个线程创建的 - 就是那个 名为fork()。父级的整个虚拟地址空间 在儿童中复制,包括互斥状态, 条件变量和其他pthreads对象;使用
pthread_atfork(3)可能有助于处理这个问题 可能导致。
然而,Solaris上有一些版本的fork
可以复制所有线程。
对forkall()或forkallx()的调用在子进程中复制 所有的线程(见 父进程中的thr_create(3C)和pthread_create(3C))。对fork1()或forkx()的调用 仅复制子进程中的调用线程。
对fork()的调用与对fork1()的调用相同;只有电话 线程在子进程中被复制。这是POSIX指定的 fork()的行为。
在Solaris 10之前的Solaris发行版中,fork()的行为 取决于申请是否与该申请有关 POSIX线程库。与-lthread链接时(Solaris线程) 但是没有与-lpthread(POSIX Threads)链接,fork()是一样的 作为forkall()。与-lpthread链接时,是否也是 与-lthread链接,fork()与fork1()相同。