You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中唯一进程与线程计数疑问:为何线程数为2?

关于进程和线程数量的疑惑解答

先明确两个核心问题的答案

a. 唯一进程数量:2个

原程序通过fork()系统调用创建了一个子进程,加上初始的主进程,总共是2个完全独立的唯一进程。每个进程拥有专属的PID、地址空间,彼此是相互隔离的执行单元。

b. 唯一线程数量:2个

这是班级讨论的正确结论,核心逻辑要结合fork()的特性和程序执行流程理解:

  • fork()只会复制当前进程的主线程到子进程中,父进程已创建的其他线程不会被复制。
  • 假设原程序的逻辑是:仅其中一个进程(父/子进程)调用了1次pthread_create()创建新线程,另一个进程只运行自身的主线程。
  • 最终总线程数就是:创建线程的进程里的新线程 + 另一个进程的主线程,总共2个唯一线程。

为什么你的打印输出看起来线程数不止2个?

你混淆了进程分支标记和实际线程的概念,这是关键误解点:

  1. 你打印里的「Thread 1/2」是程序里if/else分支的自定义标记(比如父进程走Thread 1分支,子进程走Thread 2分支),并不是实际的线程ID或线程编号。
  2. 输出里的不同数值(1855、1859、0)和进程ID有关:
    • 父进程中fork()会返回子进程的PID(比如1859),自身PID是另一个数值;
    • 子进程中fork()返回0,自身PID是1855。
  3. 你看到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:21:39