Параллельный / асинхронный доступ к общим данным - PullRequest
0 голосов
/ 19 января 2012

Я немного обыскал, но не смог найти ничего полезного. Может ли кто-нибудь помочь мне с этой проблемой параллелизма / синхронизации?

Учитывая пять экземпляров программы ниже, выполняемой асинхронно, с s являющимися общими данными с начальным значением 0 и i локальной переменной, значения которой можно получить s?

for (i = 0; i < 5; i ++) {
    s = s + 1;
}
  1. 2
  2. 1
  3. 6

Я хотел бы знать, какие значения и почему именно.

1 Ответ

1 голос
/ 19 января 2012

Не отвечающий ответ: Uaaaagh, не делайте этого.

Ответ, более важный в смысле вашего вопроса, таков: В принципе, любое значение возможнопотому что это совершенно не определено.У вас нет строгой гарантии, что одновременные записи являются атомарными в любом случае и не приводят к полному мусору.
На практике записи размером менее машинного слова везде атомарны везде (для чего язнаю, по крайней мере), но у них нет определенного порядка.Кроме того, вы обычно не знаете, в каком порядке запланированы потоки / процессы.Таким образом, вы никогда не увидите значение «случайного мусора», но также вы не можете знать, что это будет.Это будет что-то 5 или выше (до 25).

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

Тем не менее, каждый экземпляр увеличивает значение как минимум в 5 раз, поэтому, кроме теоретической возможности «общего мусора», нет значения, которое могло бы быть меньше 5.результат в конце.Поэтому (1) и (2) невозможны, а (3).

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