for(int i = 0; i <3;i++){ fork(); pthread_create(); fork(); }
对于这段代码,有人知道创建了多少个线程吗?每个子进程中是否都创建了一个线程?
我不太确定分叉后如何创建线程。我认为结果要么是 42,意味着 2+8+32(创建每个线程之前存在的进程数),要么是 3,如果创建的线程仅在子进程内部创建
fork
函数将进程拆分为自身的副本,然后两个进程都从下一行继续。重要的是,这会复制整个进程状态,其中包括属于该进程的所有线程。
在循环之前,假设进程只有一个线程。
第一次迭代的示例:
fork
上,您现在有两个进程,每个进程都有一个线程。pthread_create
,因此您有两个进程,每个进程有两个线程。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
。