C中的竞争条件

aqu*_*ini 14 c operating-system race-condition

我在分析过去的OS考试问题时遇到了麻烦.它如下:

描述以下程序的输出.是否存在竞争条件?

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); 
    }
}
Run Code Online (Sandbox Code Playgroud)

在C和比赛条件方面我不是那么好,所以我的答案主要是猜测.但是如果我在考试中看到这个,我会说"程序将一个进程分成一个父进程和子进程;子进程打印'Output1',父进程打印'Output2',一次一个字符.然后总数在程序结束时打印字母;但是,这个变量'count'可能不准确,因为孩子和父母之间存在竞争条件.任何时候都可以访问和更新计数,这可能导致不准确."

根据我的理解,当两个或多个线程或进程尝试访问或设置相同的共享变量时会出现竞争条件,而我在此程序中可以看到的唯一事件是"计数".我是否接近正确,如果没有,可以添加到该程序中以创建竞争条件(假设,当然;我知道这不是我们想要做的)?

NPE*_*NPE 14

count目前而言,没有竞争:两个过程中的每一个都有自己独立的count.

至于字符"Output 1""Output 2"出现的顺序,stdout确实存在竞争:两个输出最终可以任意交错.

  • @CoconutJones这取决于标准输出文件描述符是否是行缓冲的. (3认同)
  • @CoconutJones或者它可以打印出"输出1输出2",或其中任何一种无数的其他组合.究竟. (2认同)