14

過去の OS 試験の問題を分析するのに苦労しています。それは次のとおりです。

次のプログラムの出力を説明してください。競合状態は存在しますか?

int count=0;
int main(void)
{   
    pid_t pid;      
    if( (pid = fork()) < 0)     
    {       
        perror("Fork error");       
        exit(1);    
    }   
    else if( pid == 0)  
    {       
        charatatime("Output 1\n");  
    }       
    else    
    {       
        charatatime("Output 2\n");  
    }   

    printf(“Count = %d”,count);
    exit(0); 
}  

static void charatatime(char * str)
{
    char * ptr;     
    int c;  
    for(ptr = str; c = *ptr++; )
    {
        count++;        
        putc(c, stdout); 
    }
}

私はまだ C と競合状態が得意ではないので、私の答えはほとんど推測です。しかし、これを試験で見た場合、「プログラムはプロセスを親プロセスと子プロセスに分割します。子プロセスは 'Output1' を出力し、親プロセスは 'Output2' を一度に 1 文字ずつ出力します。その後、合計数は文字数がプログラムの最後に出力されますが、子と親の間に競合状態が存在するため、この変数 'c​​ount' は不正確である可能性があります。どちらもいつでも count にアクセスして更新できるため、不正確になる可能性があります。

私の理解では、2 つ以上のスレッドまたはプロセスが同じ共有変数にアクセスまたは設定しようとすると競合状態が発生し、このプログラムで確認できる唯一のインシデントは「カウント」です。私はどこか正しいのでしょうか? そうでない場合、競合状態を作成するためにこのプログラムに何を追加できますか?

4

2 に答える 2

14

関係する限りcount、競合はありません。2 つのプロセスのそれぞれに独自の個別のcount.

と の文字が"Output 1""Output 2"表示される順序stdoutに関しては、実際に競合があります。2 つの出力が任意にインターリーブされる可能性があります。

于 2013-03-12T09:02:45.327 に答える
1

https://github.com/madan-ram/race-Condition/blob/master/race_condition.cこれはあなたを助ける..

親と子がどの順序で printf ステートメントを実行するかわからないため、stdout の print, content の順序が変化することがわかります。

于 2013-03-31T09:25:39.490 に答える