C: printf (с вилкой ()) - PullRequest
       3

C: printf (с вилкой ())

1 голос
/ 20 июня 2011

В следующем коде:

int i = 1;
fork();
i=i*2;
fork();
i=i*2;
fork();
i=i*2;

printf("%d\n", i);

Почему печатается 8,8,8,8,8,8,8,8, а не 1,2,2,4,4,8,8,8?fork () дублирует процесс и печатает i перед каждой вилкой.Что я скучаю?

Ответы [ 3 ]

2 голосов
/ 20 июня 2011

Учитывая показанный код, вы должны увидеть восемь лотов по 6 (вы написали i = i + 2; вместо i = i * 2; для последнего вычисления.

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

Чтобы получить ожидаемый результат, вам нужно отследить, дал ли каждый fork() родительский или дочерний процесс:

int i = 1;
if (fork())
{
    i=i*2;
    if (fork())
    {
        i=i*2;
        if (fork())
            i=i*2;    // + --> *
    }
}
printf(|%d\n", i);

Я предполагаю, что с операцией fork() проблем нет. Также интересно отметить, что вы можете инвертировать любое или все условия и в итоге получить тот же результат.

0 голосов
/ 20 июня 2011

Каждый новый процесс получает копию стека родителя, поэтому сразу после вызова fork () и родитель, и потомок имеют одинаковое значение для i - но они не имеют одинакового стек, просто копия ... поэтому изменение значения i в одном процессе не влияет на другой.

Если вы хотите, чтобы два параллельных фрагмента кода совместно использовали одну и ту же память, используйте либо потоки (и память,кучи, а не в стеке), или используйте явную область разделяемой памяти.

0 голосов
/ 20 июня 2011

Поскольку fork продолжает выполнять код по мере его уменьшения.Таким образом, каждый из процессов будет проходить через i = i * 2 каждый раз, когда они порождают больше детей.Делая это, что вы получаете, а не то, что вы ожидали (то есть он не прыгает в конец блока после разветвления).

Информация о форке: http://www.csl.mtu.edu/cs4411/www/NOTES/process/fork/create.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...