Обновление одной и той же переменной параллельно?

У меня есть глобальная переменная foo, которую я бы хотел, чтобы люди могли увеличивать общий доступ.

int foo;
function addToFoo(int value) public {
   foo += value
}

Я обеспокоен тем, что если эта функция может выйти из строя из-за регресса.

например: позволяет предположить, что foo в настоящее время равен 1, тогда если пользователь A вызывает addToFoo(1), а пользователь B вызывает addToFoo(2), тогда я бы хотел, чтобы foo был 3. Однако, если пользователь A и B совершают свои звонки почти в одно и то же время, то я обеспокоен тем, что foo может равняться 1 или 2 вместо 3, из-за того, что оба хватают одинаковое начальное значение foo.

Итак, мой вопрос в том, что лучше всего гарантировать, что foo всегда 3?

Могу ли я использовать мьютекс и петлю во время использования мьютекса или это сгорит слишком много газа?

Должен ли я просто вернуться, когда foo используется? Это действительно здорово.

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

Ни одно из этих решений не кажется большим ...

Любая помощь будет очень благодарна!

9 голосов | спросил mark 26 MarpmMon, 26 Mar 2018 21:00:59 +03002018-03-26T21:00:59+03:0009 2018, 21:00:59

2 ответа


9

Транзакции полностью сериализованы, поэтому здесь нет никаких проблем. Либо A или B будет идти первым, а вторая транзакция будет использовать полученное состояние из первой транзакции.

ответил smarx 26 MarpmMon, 26 Mar 2018 21:09:08 +03002018-03-26T21:09:08+03:0009 2018, 21:09:08
3

Использование мьютекса необходимо только в параллельной среде, и нет параллелизма, связанного с evm, где выполняется ваш код целостности.

Транзакции заносятся в блоки в порядке и транзакции A, а транзакция B будет выполняться в порядке их заполнения.

ответил Achala Dissanayake 26 MarpmMon, 26 Mar 2018 21:16:34 +03002018-03-26T21:16:34+03:0009 2018, 21:16:34

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132