簡體   English   中英

if else 語句與 fork() 的並發

[英]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是一個系統調用,它執行以下操作(抽象地說,現代系統上的實際實現可能會有所不同):

  • 在內存中創建進程映像的副本,並將其設置為具有自己 PID 的進程
  • 在一張圖片中(孩子)返回 0
  • 在第二個圖像(父)中返回新進程的 PID
  • 像往常一樣安排兩個圖像的執行

因此,在多核系統上,父子進程將獨立執行,沒有其他同步,彼此之間沒有任何聯系。

如果您觀察這兩個進程的輸出,您會發現它們的輸出可以以任何形狀或形式出現 - 您可以在子進程的輸出之前從父進程輸出,繼承它或與它交錯 - 它是無法預測你最終會看到什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM