我有这段代码,并试图了解将由此创建多少进程和线程:
pid t pid;
pid = fork();
if (pid == 0) { /* child process */
fork();
thread create( . . .);
}
fork();
我认为它从 if 循环内的 fork 创建了 2 个线程。和8个过程?但我不确定那是否正确
我有这段代码,并试图了解将由此创建多少进程和线程:
pid t pid;
pid = fork();
if (pid == 0) { /* child process */
fork();
thread create( . . .);
}
fork();
我认为它从 if 循环内的 fork 创建了 2 个线程。和8个过程?但我不确定那是否正确
实际上,应该有 8 个线程和 6 个进程。
为了清楚起见,这里有图表:
1) after first fork():
|------------------- child of p0 [p1]
---|------------------- parent [p0]
2) after second fork():
|--------------- child of p1 [p2]
|---|--------------- [p1]
---|------------------- [p0]
3) after pthread_create():
----------- thread 1 of p2 [p2t1]
|---/----------- thread 0 of p2 [p2t0]
| ----------- thread 1 of p1 [p1t1]
|---|---/----------- thread 0 of p1 [p1t0]
---|------------------- [p0]
4) after third fork():
|------------ child of p2 [p5]
| ------ [p2t1]
|-|-----/------ [p2t0]
| |---------- child of p1 [p4]
| | ------ [p1t1]
|---|---|---/------ [p1t0]
| |------------ child of p0 [p3]
---|-----|------------ [p0]
重要:请记住,fork(2)调用只克隆执行它的线程,因此进程 4 [p4] 只有一个线程(同样适用于进程 5[p5])。
每次fork
调用都会创建一个额外的进程。
在第一次调用 时fork
,父进程 P 创建子进程 SP1。在 fork 之后,父进程fork
再次调用(跳过if
),创建子进程 SP2。
fork
SP1内部fork 调用后if
,创建子子进程 SSP1。SP1 然后产生一个线程。SP1 离开if
. 并再次调用fork
,创建子子流程 SSP2。
SSP1 产生一个线程。SSP1 离开if
, 并调用fork
, 创建子子子流程 SSSP。
因此,创建的进程:SP1、SP2、SSP1、SSP2、SSSP = 5 个进程。如果算上原始进程 P,则有 6 个进程。
只有 SP1 和 SSP1 产生线程,因此创建了 2 个线程。如果统计所有进程的所有主线程,有7个或8个线程,这取决于你算不算原始进程P。
正在创建的与代码相关的进程和线程的图示。
P
pid t pid; |
pid = fork(); +------SP1
if (pid == 0) { | |
fork(); | +---------------SSP1
thread create(...); | |-SP1's thread |-SSP1's thread
} | | |
fork(); +-SP2 +-SSP2 +-SSSP
| | | | | |
不应该是2个线程和6个进程吗?
M
| ↘
M A
| |↘
M A* B*
| | |
| ↘ | ↘ |↘
M C A D B E
因为我使用 * 来表示线程。
总分叉进程是=5 线程创建是=2