在很多的分支并行結(jié)構(gòu)中,常常用到fork...join的結(jié)構(gòu)。
簡(jiǎn)單說(shuō),fork...join/join_any/join_none結(jié)構(gòu)用作并發(fā)執(zhí)行,阻塞父進(jìn)程的執(zhí)行,直到子進(jìn)程執(zhí)行完畢。
用于區(qū)分begin...end語(yǔ)句的順序執(zhí)行:
1)用begin_end語(yǔ)句,通常用來(lái)標(biāo)識(shí)順序執(zhí)行的語(yǔ)句,用它標(biāo)識(shí)的塊稱作順序塊;
2)用fork_join語(yǔ)句,通常用來(lái)標(biāo)識(shí)并行執(zhí)行的語(yǔ)句,用它標(biāo)識(shí)的塊稱作并行塊。

1. fork...join
????????????fork // $(0s)
????????????? ? a; // (need 5s)
????????????? ? b; // (need 2s)
????????????? ? c; // (need 3s)
????????????join
????????????d; // $(5s)
當(dāng)運(yùn)行到fork處時(shí),a、b、c三條子線程將會(huì)同時(shí)開(kāi)啟,直到三條線程都運(yùn)行完畢,d語(yǔ)句才會(huì)開(kāi)始執(zhí)行,通常在此處取決于子線程中時(shí)間最長(zhǎng)的那條。
2. fork...join_any
????????????fork // $(0s)
? ????????????? a; // (need 5s)
????????????? ? b; // (need 2s)
????????????? ? c; // (need 3s)
????????????join_any
????????????d; // $(2s)
當(dāng)運(yùn)行到fork處時(shí),a、b、c三條子線程同時(shí)開(kāi)啟,但d語(yǔ)句的開(kāi)啟,將會(huì)取決于a、b、c中運(yùn)行時(shí)間最短的那條。且a與c會(huì)自行繼續(xù)運(yùn)行,直到執(zhí)行完畢。
3. fork...join_none
????????????fork // $(0s)
????????????? ? a; // (need 5s)
????????????? ? b; // (need 2s)
????????????? ? c; // (need 3s)
????????????join_none
????????????d; // $(0s)
當(dāng)運(yùn)行到fork處時(shí),a、b、c三條子線程將與d語(yǔ)句同時(shí)開(kāi)啟,也就是說(shuō)fork...join_none只起到了點(diǎn)火的作用,將線程開(kāi)啟而不占用時(shí)間。
