Условия гонки в C - программирование
Подтвердить что ты не робот

Условия гонки в 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 "может быть неточной, поскольку существует условие расы между дочерним и родительским. В любой момент можно получить доступ и обновить счет, что может привести к неточностям".

По моему мнению, условия гонки возникают, когда два или более потока или процессов пытаются получить доступ или установить одну и ту же общую переменную, и единственным инцидентом, который я вижу в этой программе, является "count". Я где-то рядом с правильным, а если нет, то что можно добавить к этой программе для создания условия гонки (гипотетически, конечно, я знаю, что не то, что мы хотели бы сделать)?

4b9b3361

Ответ 1

Что касается count, то нет расы: каждый из двух процессов имеет свой отдельный count.

Что касается порядка, в котором символы "Output 1" и "Output 2" появляются на stdout, действительно существует расы: два выхода могут быть чередуются произвольно.

Ответ 2

https://github.com/madan-ram/race-Condition/blob/master/race_condition.c это поможет вам.

как вы видите, что stdout print, порядок содержимого изменяется, потому что мы не знаем, в каком порядке родительский и дочерний выполняет инструкцию printf.