【问题标题】:Race Conditions in CC中的竞争条件
【发布时间】:2013-02-27 17:06:16
【问题描述】:

我在分析过去操作系统考试中的问题时遇到了问题。如下:

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

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',一次一个字符。然后总数字母的数量在程序结束时打印;但是,这个变量“计数”可能不准确,因为孩子和父母之间存在竞争条件。任何一方都可以随时访问和更新计数,这可能导致不准确。

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

【问题讨论】:

  • +1 在发布到 SO 之前做出合理的尝试
  • count这里不共享,每个进程都有自己的副本。
  • 对对对……因为只有从这个进程中分离出来的多个线程才会共享它,对吧?这是否意味着没有竞争条件?
  • 这两个进程不是你跳过那个fork()的那一刻吗。那时不是唯一的 race 之间谁可以先将 IO 队列中的 putc() 转储到控制台?我没有看到线程问题。关于 Neil 的评论,它可能进程之间交织,但如果孩子在父母恢复之前没有完全完成,我会感到惊讶(反之亦然)。
  • @WhozCraig 是的,没错

标签: c operating-system race-condition


【解决方案1】:

count而言,不存在竞争:两个进程中的每一个都有自己独立的count

至于"Output 1""Output 2"这两个字符在stdout上出现的顺序,确实有比赛:两个输出可以任意交错。

【讨论】:

  • 好的。所以它可以像“OOutputputput 1 2”或任何其他任意顺序打印出来?这将通过添加锁(某处)来解决?
  • @CoconutJones:是的,是的。
  • 优秀。谢谢你和大家!
  • @CoconutJones 这取决于标准输出文件描述符是否被行缓冲。
  • @CoconutJones 或者它可以打印出“Output 1Output 2”,或者其中的任何其他组合。没错。
【解决方案2】:

https://github.com/madan-ram/race-Condition/blob/master/race_condition.c这会对你有所帮助..

正如您所见,stdout 打印内容的顺序发生了变化,因为我们不知道父子进程执行 printf 语句的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2016-03-07
    • 2011-07-17
    相关资源
    最近更新 更多