Прежде всего, я хотел бы поблагодарить вас, ребята, за то, что он дал мне понять, что я подробно читаю standard. В противном случае я не смог бы продолжить эту дискуссию.
Стандартные состояния довольно четко в разделе 1,10 пункте 21: The execution of a program contains a data race if it contains two conflicting actions in different threads, at least one of which is not atomic, and neither happens before the other. Any such data race results in undefined behavior.
Однако термин undefined behavior
также определен в стандарте, раздел 1.3.24: behavior for which this International Standard imposes no requirements... Permissible undefined behavior ranges from ignoring the situation completely with unpredictable results, to behaving during translation or program execution in a documented manner characteristic of the environment...
Принимая ответ Sebasian в отношении std::terminate
на счет, и работая в предположении, что эти потоки не будут вызывать исключение, тем самым вызывая преждевременное прекращение; в то время как стандарт не определяет результат - довольно очевидно, что это может быть из-за простоты алгоритма. Другими словами, хотя 100% точный ответ будет заключаться в том, что результат не определен, я все же утверждаю, что диапазон возможных результатов хорошо определен и составляет 10-30 из-за characteristic of the environment
.
BTW - Я действительно хотел сделать это замечание вместо другого ответа, однако он был слишком длинным
расы данных являются UB, как таковой любой диапазон «действует». – PlasmaHH
Если 'int count' был заменен на' std :: atomic count', то (я считаю), что мы больше не имеем неопределенного поведения. Предварительное приращение и пост-приращение являются атомарными; но 'count = count + 1' не гарантированно будет атомарным - это вернет нас к UB или просто означает, что у нас есть неопределенное поведение? –
Это только неуказано, и в этом случае вы действительно можете получить возможный диапазон значений. –