2016-10-18 1 views
0

У меня вопрос со старого экзамена, учитывая код C и m - глобальная переменная, когда программа заканчивает то, что значение m, ответ «от 7 до 19», но я не понимаю, почему, может кто-нибудь объяснить это мне почему ответ между 7-19 и не совсем 19.Почему вывод этой программы на C, использующей fork и общую память?

int m = 0; 

int main() { 
    int i; 

    fork(); 
    m=3; 
    fork(); 
    for(i=0;i<4;i++) 
     m++; 
} 
+8

@KerrekSB Наверное мне нужно кофе, но не должно быть '7' значение' M' в конце каждого процесса ? – LPs

+3

То, что вы помните, является, вероятно, не тем, что было, потому что нет возврата к основному, а fork просто дублирует все в этой программе. Таким образом, все 4 программы завершатся с m = 7. –

+0

Я собирался ответить на это, но [поскольку глобальные переменные не разделяются] (https://stackoverflow.com/questions/4298678/after-forking-are-global-variables-shared), 'm' будет' 7 'в конце каждого клона. Если мы предположим, что [мы разделяем переменную] (http://stackoverflow.com/q/13274786/1270789), то переменная будет всегда '11', я думаю, за исключением того, что, поскольку одна копия может читать переменную одновременно с напишите, может возникнуть непредвиденное поведение. Это очень плохой вопрос для экзамена! BTW, 'fork(); fork(); m = 3;' может давать от 7 до 19, предполагая общую память и т. Д. –

ответ

1

Первое, что нужно заметить, анализируя эту проблему в том, что нет блокировки вызовов, это означает, что, когда основной процесс достигает конца основная программа завершится, независимо от того, в каком состоянии находятся другие процессы.

Используя этот факт, мы можем разработать нижний предел m: это произойдет, когда разветвленные процессы не изменят e значение m до выхода основного процесса. В этом случае m начнется с 3 и будет добавлено до 4 раз в цикле, что даст вам нижний предел m = 7.

Верхний предел будет происходить, когда все процессы будут порождены до того, как кто-либо вступит в цикл, а затем каждый процесс добавит от 4 до m (который будет иметь начальное значение 3). Другими словами, m = 3 + N*4, где N - общее количество процессов, порожденных.

Чтобы наконец получить верхний предел, нам нужно знать, сколько процессов порождено. Первый вызов fork() превратит один процесс в два, и последующий вызов fork() превратит каждый из этих процессов в два, что означает, что N = 4.

Используя наше выражение для m от до этого мы видим, что верхний предел m = 3 + 4 * 4 = 19

Смежные вопросы