Последовательность последовательности изменений перед изменением

С http://en.cppreference.com/:

Упрощенное упорядочение Атомарные операции, помеченные как std::memory_order_relaxed, не являются операциями синхронизации, они не упорядочивают память. Они только гарантируют атомарность и согласованность порядка модификации. Например, с х и у изначально ноль,

// Thread 1:
r1 = y.load(memory_order_relaxed); // A
x.store(r1, memory_order_relaxed); // B
// Thread 2:
r2 = x.load(memory_order_relaxed); // C 
y.store(42, memory_order_relaxed); // D

разрешено производить r1 == r2 == 42, потому что, хотя A чередуется до B, а C чередуется до D, ничто не мешает D появляться перед A в порядке модификации y, а B - перед C в модификации порядок х.

Вопрос: Что это за вещь, которая придает вышеуказанному коду свойство A упорядочено до B, а C упорядочено перед D?

РЕДАКТИРОВАТЬ:

int A, B;

void foo()
{
    A = B + 1; (A)
    B = 0; (B)
}

привести к

$ gcc -O2 -S -masm=intel foo.c
$ cat foo.s
        ...
        mov     eax, DWORD PTR B
        mov     DWORD PTR B, 0
        add     eax, 1
        mov     DWORD PTR A, eax
        ...

по GCC 4.6.1 с опцией -02

поэтому мы ясно видим, что (A) и (B) были переключены

2 ответа

Решение

Отношения секвенированные до (не такие, как раньше) не относятся к многопоточности. Они бывают и в однопоточных программах. Любое выражение, оканчивающееся точкой с запятой, упорядочивается до следующего, поэтому в этом случае A последовательность перед B а также C до D потому что каждый из них является полным выражением.

Из Стандарта 1.9 Выполнение программы 14:

Каждое вычисление значения и побочный эффект, связанный с полным выражением, упорядочивается перед каждым вычислением значения и побочным эффектом, связанным со следующим полным выражением, которое будет оценено.

Вы можете найти объяснение здесь:

Порядок оценки

"Sequenced-before" применяется к видимому наблюдаемому поведению вашей программы. Компилятор может использовать это поведение любым способом, который ему нужен; он может переупорядочивать записи в память или полностью исключать их, если видимое поведение одинаково.

На вопрос нет ответа. Нет стандартной нити семантики конца истории.

Утверждение, что существует стандартизованная семантика потоков или любая семантика любой программы, - это обман.

Другие вопросы по тегам