c - C 中的竞争条件

标签 c operating-system race-condition

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

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

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

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

最佳答案

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

关于"Output 1""Output 2"的字符出现在stdout上的顺序,确实有一个race:两个输出最终可以任意交错。

关于c - C 中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15356935/

相关文章:

c - GCC 数组默认填充值

c - 独立的 C 共享库

C:首先使用 printf 和 scanf 函数打印一个带有 0(08) 的数字

c - 从c中的命令行读取数字

python - 错误 : The expanduser ('~' ) cannot be added to dirs. 'xxx' :'xxx"

linux - 为什么系统调用需要中断

c - 为什么要将文件分割成 block 以进行 HTTP 流式传输?

java - 是否可以读取可能同时写入的变量?

c++ - pthread广播然后等待?

linux-kernel - wait_event 和wake_up 之间的竞争条件