2013-03-12 158 views
14

我有麻煩在過去的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」可能不準確,因此可能隨時訪問和更新計數,這可能會導致不準確。

從我的理解,競爭條件出現時,兩個或更多的線程或進程嘗試訪問或設置相同的共享變量,那唯一的事件,我可以在這個程序看到的是「計數」。我是否接近正確,如果不是,可以在此程序中添加什麼來創建競爭條件(假設,當然,我知道這不是我們想要做的)?

+8

+1張貼之前作出合理的嘗試,在此SO – 2013-03-12 09:01:03

+3

'count'這裏沒有共享,每個進程都有自己的副本。 – 2013-03-12 09:01:04

+0

不是一個真正的競爭條件,但putc會在兩個線程之間交錯。 – Neil 2013-03-12 09:02:45

回答

14

至於count而言,沒有比賽:這兩個過程中都有自己獨立的count

至於在stdout上出現"Output 1""Output 2"的字符的順序,確實存在競賽:兩個輸出可以以任意交錯結束。

+0

好的。那麼它可以打印出像「OOututputput 1 2」或任何其他任意順序?這將通過添加鎖(某處)來解決? – aquemini 2013-03-12 09:05:33

+0

@CoconutJones:是的,是的。 – NPE 2013-03-12 09:06:18

+0

非常好。感謝你和每個人! – aquemini 2013-03-12 09:08:19