過去の 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 文字ずつ出力します。その後、合計数は文字数がプログラムの最後に出力されますが、子と親の間に競合状態が存在するため、この変数 'count' は不正確である可能性があります。どちらもいつでも count にアクセスして更新できるため、不正確になる可能性があります。
私の理解では、2 つ以上のスレッドまたはプロセスが同じ共有変数にアクセスまたは設定しようとすると競合状態が発生し、このプログラムで確認できる唯一のインシデントは「カウント」です。私はどこか正しいのでしょうか? そうでない場合、競合状態を作成するためにこのプログラムに何を追加できますか?