Для суммы не существует единого значения. Если есть 0 условий гонки, значение будет 200. Если на каждой итерации петли есть условия гонки (маловероятно), она может достигать 100. Или это может быть где угодно.
Вероятно, вы думаете о сумме ++ как о атомарной операции, но на самом деле это синтаксический сахар для sum = sum + 1. В этой операции существует вероятность состояния гонки, поэтому при каждом запуске сумма может быть различной.
Представьте, что текущее значение суммы равно 10. Затем t1 попадает в цикл и считывает значение суммы (10), а затем останавливается, чтобы начать запуск t2. Затем t2 будет считывать одно и то же значение (10) суммы как t1. Затем, когда каждый шаг увеличивается, они будут увеличивать его до 11. Если других условий гонки нет, конечное значение суммы будет 199.
Вот еще худший случай. Представьте, что текущее значение суммы равно 10. t1 входит в цикл и считывает значение sum (10), затем останавливается, чтобы t2 начал работать. t2, снова, считывает значение sum (10), а затем сам останавливается. Теперь t1 снова запускается, и он проходит через 10 раз, задавая значение sum на 20. Теперь t2 снова запускается и увеличивает сумму до 11, поэтому вы фактически уменьшили значение суммы.
Все может случиться. Это UB-http :: //stackoverflow.com/questions/37325524/does-integer-overflow-cause-undefined-behavior-because-of-memory-corruption/37325854#37325854 –
Из любопытства я исправил программу для C++ 11, и у меня было «202» в качестве первого результата. Это означает, что любой, кто считает диапазон 100-200, является неправильным. По какой-то причине внимательно посмотрите на код;) Однако он остается UB. – stefaanv
Обратите внимание, что заголовок ссылается на ** префикс ** operator ++, но в коде используется ** postfix **. Не то, что это влияет на результат ... –