我无法分析过去操作系统考试中的问题。如下:
描述以下程序的输出。是否存在竞争条件?
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',一次一个字符。然后总数字母的数量在程序结束时打印;但是,这个变量“计数”可能不准确,因为孩子和父母之间存在竞争条件。任何一方都可以随时访问和更新计数,这可能导致不准确。
据我了解,当两个或多个线程或进程尝试访问或设置相同的共享变量时,就会出现竞争条件,而我在这个程序中唯一能看到的事件是“计数”。我是否接近正确,如果不正确,可以在该程序中添加什么来创建竞争条件(当然是假设的;我知道这不是我们想要做的)?