2012-01-19 5 views
0

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

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

for (i = 0; i < 5; i ++) { 
    s = s + 1; 
} 

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

ответ

1

Ответ на неответ: Uaaaagh, не делайте такого.

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

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

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

+0

Спасибо за беспокойство. Я знаю, что это ТЕПЕРЯемая идея. Это был вопрос экзамена, на который я не мог быть уверен, что я прав. Моя собственная концепция была такой же, как ваша. Два гения не могут ошибаться, да? ;-) –