2013-03-12 7 views
14

過去のOS試験の問題を分析するのに問題があります。Cの競争条件

次のプログラムの出力を記述します。競合状態が存在するか?

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」を印刷し、親プロセスは一度に1文字ずつ「Output2」を印刷します。しかし、この変数 'c​​ount'は不正確である可能性があります。子供と親の間に競合条件が存在するためです。不正確につながる可能性があるいつでもカウントにアクセスして更新することができます。

私の理解から、二つ以上のスレッドやプロセスが同じ共有変数にアクセスしたり、設定しようとすると、競合状態が発生し、私はこのプログラムで見ることができる唯一の事件は「数」です。私はどこにいても正しかったのですが、もしそうでなければ、このプログラムに何が追加されて競争条件が創り出されたのでしょうか?(もちろん、私たちがやりたいことではありません。

+8

+1に投稿する前にこれを妥当なものにしようとすると、 –

+3

ここで 'count'は共有されません。各プロセスには独自のコピーがあります。 –

+0

競合状態にはなりませんが、putcは両方のスレッド間でインターレースを行います。 – Neil

答えて

14

countまでは、レースはありません.2つのプロセスのそれぞれには、それぞれ独自のcountがあります。

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

+0

よろしくお願いします。だから "OOututputput 1 2"や他の任意の順序のように印刷することができますか?そして、これはロックを追加することで解決されます(どこか)? – aquemini

+0

@CoconutJones:はいとはい。 – NPE

+0

優れています。皆さん、ありがとう! – aquemini

関連する問題