У меня возникли проблемы с анализом проблемы на предыдущем экзамене в ОС. Это выглядит так:
Опишите выход следующей программы. Существует ли условие гонки?
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". Я где-то рядом с правильным, а если нет, то что можно добавить к этой программе для создания условия гонки (гипотетически, конечно, я знаю, что не то, что мы хотели бы сделать)?