[英]if else statement concurrency with fork()
在閱讀有關 C 中 fork() 的一些文章時,我看到了這個我無法理解的示例(下面的代碼):
理解問題:我們只運行“if”或“else”,而不是同時運行。 但是由於子進程和父進程“同時”運行,在這個例子中我們看到我們同時經歷了“if”和“else”! 盡管它是同時發生的,但實際上並非如此,這取決於哪個進程將首先獲得 CPU(對嗎?)。
使一切變得“奇怪”的是我們可能首先通過“else”然后通過“if”。 這怎么可能 ?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void forkexample()
{
// child process because return value zero
if (fork() == 0)
printf("Hello from Child!\n");
// parent process because return value non-zero.
else
printf("Hello from Parent!\n");
}
int main()
{
forkexample();
return 0;
}
可能的輸出是:
孩子你好!
家長問好!
(要么)
家長問好!
孩子你好!
請記住, fork
函數實際上返回了兩次:一次返回父進程的 pid,一次返回子進程的 0。
此時,您有兩個獨立的進程運行相同的代碼並打印到同一個終端。 並且由於您有兩個進程,內核可以自由地以任何它認為合適的方式調度它們,這意味着任何一個進程的輸出都可以以任何順序出現。
fork
是一個系統調用,它執行以下操作(抽象地說,現代系統上的實際實現可能會有所不同):
因此,在多核系統上,父子進程將獨立執行,沒有其他同步,彼此之間沒有任何聯系。
如果您觀察這兩個進程的輸出,您會發現它們的輸出可以以任何形狀或形式出現 - 您可以在子進程的輸出之前從父進程輸出,繼承它或與它交錯 - 它是無法預測你最終會看到什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.