我有麻煩在過去的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