C语言中唯一进程与线程计数疑问:为何线程数为2?
关于进程和线程数量的疑惑解答
先明确两个核心问题的答案
a. 唯一进程数量:2个
原程序通过fork()系统调用创建了一个子进程,加上初始的主进程,总共是2个完全独立的唯一进程。每个进程拥有专属的PID、地址空间,彼此是相互隔离的执行单元。
b. 唯一线程数量:2个
这是班级讨论的正确结论,核心逻辑要结合fork()的特性和程序执行流程理解:
fork()只会复制当前进程的主线程到子进程中,父进程已创建的其他线程不会被复制。- 假设原程序的逻辑是:仅其中一个进程(父/子进程)调用了1次
pthread_create()创建新线程,另一个进程只运行自身的主线程。 - 最终总线程数就是:创建线程的进程里的新线程 + 另一个进程的主线程,总共2个唯一线程。
为什么你的打印输出看起来线程数不止2个?
你混淆了进程分支标记和实际线程的概念,这是关键误解点:
- 你打印里的「Thread 1/2」是程序里
if/else分支的自定义标记(比如父进程走Thread 1分支,子进程走Thread 2分支),并不是实际的线程ID或线程编号。 - 输出里的不同数值(1855、1859、0)和进程ID有关:
- 父进程中
fork()会返回子进程的PID(比如1859),自身PID是另一个数值; - 子进程中
fork()返回0,自身PID是1855。
- 父进程中
- 你看到的4行打印,其实是两个进程的主线程分别执行了两次输出:
- 父进程的主线程输出了
Thread 1: 0 1859和Thread 1: 0 0; - 子进程的主线程输出了
Thread 2: 1855 0和Thread 2: 0 0。
这些都是两个进程的主线程在工作,和原程序中pthread_create创建的额外线程无关——那个额外线程加上另一个进程的主线程,才是总共2个唯一线程。
- 父进程的主线程输出了
课堂展示必备知识点
fork()是创建新进程,不是线程:进程间完全隔离,拥有独立的资源空间;fork()仅复制主线程:子进程从fork()返回处开始执行,只有一个主线程,父进程的其他线程不会被带入;- 线程是进程内的执行单元:同一进程内的线程共享资源,不同进程的线程完全独立,不能算作同一个唯一线程。
内容的提问来源于stack exchange,提问作者xLilCasper
相关产品推荐
相关产品推荐

