我有麻烦在过去的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',父进程打印'Output2',每次一个字符。的字母打印在程序末尾;但是,由于儿童和父母之间存在竞争状态,因此该变量“count”可能不准确,因此可能随时访问和更新计数,这可能会导致不准确。
从我的理解,竞争条件出现时,两个或更多的线程或进程尝试访问或设置相同的共享变量,那唯一的事件,我可以在这个程序看到的是“计数”。我是否接近正确,如果不是,可以在此程序中添加什么来创建竞争条件(假设,当然,我知道这不是我们想要做的)?
+1张贴之前作出合理的尝试,在此SO – 2013-03-12 09:01:03
'count'这里没有共享,每个进程都有自己的副本。 – 2013-03-12 09:01:04
不是一个真正的竞争条件,但putc会在两个线程之间交错。 – Neil 2013-03-12 09:02:45