последовательность до модификации порядка согласованности

с http://en.cppreference.com:

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

// 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 в модификации порядок x.

Вопрос: Что наделяет приведенный выше код свойством 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) поменялись местами


person Guillaume07    schedule 13.12.2014    source источник
comment
Правдивый ответ был скрыт модераторами: ваше недоразумение, очевидно, основано на том, что, по вашему мнению, стандарт хорошо написан и надежен, и что программы могут иметь определенное поведение. Все это неправда. Нет определения семантики потока, нет даже проблеска ее начала.   -  person curiousguy    schedule 21.01.2020
comment
@BooberBunz Это не дает ответа на вопрос. На самом деле. Это единственный возможный ответ. Если вы не согласны, оставьте комментарий, не подвергайте ответы цензуре.   -  person curiousguy    schedule 21.01.2020


Ответы (3)


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

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

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

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

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

person imreal    schedule 13.12.2014
comment
компилятор и процессор могут переупорядочивать инструкции - person Guillaume07; 13.12.2014
comment
@ Guillaume07 Без заборов памяти да. - person imreal; 13.12.2014
comment
Я имел в виду, что в коде, который я публикую, нет ограждения, поэтому, насколько мне известно, ничто не мешает компилятору или процессору выполнить переупорядочение. Но кажется, что существует связь с последовательностью до, но я не вижу, где здесь и как это работает, что цель моего вопроса - person Guillaume07; 13.12.2014
comment
@ Guillaume07 Хорошо, тогда да - person imreal; 13.12.2014
comment
@ Guillaume07 Отношения упорядоченные до учитываются только внутри потока. Это означает, что первый поток увидит побочные эффекты A перед побочными эффектами B, но нет гарантии, в каком порядке их увидит второй поток. - person imreal; 13.12.2014
comment
согласно тому, что сказано в следующей ссылке: preshing.com/20120625/ упорядочение памяти во время компиляции даже в одном потоке полное выражение может быть переупорядочено компилятором - person Guillaume07; 14.12.2014
comment
@ Guillaume07 Ага, но побочные эффекты (в абстрактной машине, а не в реальной программе) выражения sequence-before гарантированно будут восприниматься первыми, В ОДНОЙ НИТИ. Я думаю, вы неправильно понимаете, что такое отношения с последовательностью до, и вы хотели спросить об отношениях происходит до и переупорядочении памяти. - person imreal; 14.12.2014

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

person Lasse Reinhold    schedule 14.12.2014

Вопрос не подлежит ответу. Нет стандартной нити семантики, конец истории.

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

person curiousguy    schedule 21.01.2020