2013-03-12 107 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