线程数

问题描述 投票:0回答:1

for(int i = 0; i <3;i++){ fork(); pthread_create(); fork(); }

对于这段代码,有人知道创建了多少个线程吗?每个子进程中是否都创建了一个线程?

我不太确定分叉后如何创建线程。我认为结果要么是 42,意味着 2+8+32(创建每个线程之前存在的进程数),要么是 3,如果创建的线程仅在子进程内部创建

c multithreading pthreads
1个回答
0
投票

fork
函数将进程拆分为自身的副本,然后两个进程都从下一行继续。重要的是,这会复制整个进程状态,其中包括属于该进程的所有线程。

在循环之前,假设进程只有一个线程。

第一次迭代的示例:

  1. 在第一个
    fork
    上,您现在有两个进程,每个进程都有一个线程。
  2. 每个进程都会调用
    pthread_create
    ,因此您有两个进程,每个进程有两个线程。
  3. 在第二个
    fork
    ,每个进程都会分裂成一个副本,因此现在有四个进程,每个进程有两个线程。

继续这样:

Iteration | After call     | Processes | Threads per process
----------+----------------+-----------+---------------------
    -     |   -            +     1     |    1
----------+----------------+-----------+---------------------
    0     | fork           |     2     |    1
    0     | pthread_create |     2     |    2
    0     | fork           |     4     |    2
----------+----------------+-----------+---------------------
    1     | fork           |     8     |    2
    1     | pthread_create |     8     |    3
    1     | fork           |     16    |    3
----------+----------------+-----------+---------------------
    2     | fork           |     32    |    3
    2     | pthread_create |     32    |    4
    2     | fork           |     64    |    4
----------+----------------+-----------+---------------------

最终有 64 个进程,每个进程都有 4 个线程。所以总共有 256 个线程。负 1,因为您从一个线程开始。您实际上已经创建了 255 个线程。

如果您只关心所有进程中对 pthread_create 进行的

实际 
调用数量,那么情况就不同了。如果这就是您想知道的,那么您的计算似乎是正确的:2 个进程在
i == 0
调用它,8 个进程在
i == 1
调用它,32 个进程在
i == 2
调用它。总共 42 次调用
pthread_create

© www.soinside.com 2019 - 2024. All rights reserved.