Скажем, я определить следующий C++ объект:Как «неопределенное» состояние гонки может быть?
class AClass
{
public:
AClass() : foo(0) {}
uint32_t getFoo() { return foo; }
void changeFoo() { foo = 5; }
private:
uint32_t foo;
} aObject;
Объект используется двумя нитями, T1 и T2. T1 постоянно вызывает getFoo()
в цикле, чтобы получить номер (который всегда будет 0, если changeFoo()
не был вызван раньше). В какой-то момент T2 вызывает changeFoo()
, чтобы изменить его (без какой-либо синхронизации потоков).
Есть ли практический вероятность того, что значения, полученные когда-либо T1 будет отличаться от 0 или 5 с современных компьютерных архитектур и компиляторы? Весь код ассемблера, который я исследовал до сих пор, это использование 32-разрядных чтений и записей в памяти, что, похоже, сохраняет целостность операции.
Как насчет других примитивных типов?
Практическая означает, что вы можете дать пример существующей архитектуры или стандартный совместимый компилятор, где это (или аналогичная ситуация с другим кодом) теоретически возможно. Я оставляю слово modern немного субъективно.
Edit: Я вижу много людей, заметив, что я не должен ожидать, 5 следует читать когда-либо. Для меня это прекрасно, и я не сказал, что делаю (хотя спасибо за указание на этот аспект). Мой вопрос был больше о том, какое нарушение целостности данных может произойти с вышеуказанным кодом.
Последний абзац не имеет смысла. ** Практический ** пример чего-то, где теоретически возможен определенный результат **? Я предлагаю вам удалить одно из этих двух слов. :) – jalf
Теоретически ** возможно, что это произойдет на ** каждой ** существующей архитектуре с ** каждым ** стандартным компилятором, потому что компилятор, совместимый со стандартами, может делать все, что ему нравится, когда он сталкивается UB. На практике компиляторы склонны прощать о UB, но теоретически * возможно, что они делают всевозможные другие странные вещи. – jalf
@jalf Здесь не имеет никакого значения, так как код не будет работать должным образом (что поток чтения в конце концов увидит 5) для любой архитектуры, которую я знаю (конечно же, не с VC++ под Windows, g ++ под Linux или Sun CC под Solaris). –