在很多的分支并行结构中,常常用到fork...join的结构。
简单说,fork...join/join_any/join_none结构用作并发执行,阻塞父进程的执行,直到子进程执行完毕。
用于区分begin...end语句的顺序执行:
1)用begin_end语句,通常用来标识顺序执行的语句,用它标识的块称作顺序块;
2)用fork_join语句,通常用来标识并行执行的语句,用它标识的块称作并行块。

1. fork...join
fork // $(0s)
a; // (need 5s)
b; // (need 2s)
c; // (need 3s)
join
d; // $(5s)
当运行到fork处时,a、b、c三条子线程将会同时开启,直到三条线程都运行完毕,d语句才会开始执行,通常在此处取决于子线程中时间最长的那条。
2. fork...join_any
fork // $(0s)
a; // (need 5s)
b; // (need 2s)
c; // (need 3s)
join_any
d; // $(2s)
当运行到fork处时,a、b、c三条子线程同时开启,但d语句的开启,将会取决于a、b、c中运行时间最短的那条。且a与c会自行继续运行,直到执行完毕。
3. fork...join_none
fork // $(0s)
a; // (need 5s)
b; // (need 2s)
c; // (need 3s)
join_none
d; // $(0s)
当运行到fork处时,a、b、c三条子线程将与d语句同时开启,也就是说fork...join_none只起到了点火的作用,将线程开启而不占用时间。
