我无法分析过去的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',一次一个字符。然后总数在程序结束时打印字母;但是,这个变量'count'可能不准确,因为孩子和父母之间存在竞争条件。任何时候都可以访问和更新计数,这可能导致不准确。“
根据我的理解,当两个或多个线程或进程尝试访问或设置相同的共享变量时会出现竞争条件,并且我在此程序中可以看到的唯一事件是“计数”。我是否接近正确,如果没有,可以添加到该程序中以创建竞争条件(假设,当然;我知道这不是我们想要做的)?
答案 0 :(得分:14)
就count
而言,没有种族:两个进程中的每一个都有自己独立的count
。
至于"Output 1"
和"Output 2"
的字符出现在stdout
上的顺序,确实存在竞争:两个输出最终可以任意交错。
答案 1 :(得分:1)
https://github.com/madan-ram/race-Condition/blob/master/race_condition.c这会对你有帮助..
当你看到stdout打印时,内容的顺序发生了变化,因为我们不知道父和子执行printf语句的顺序。