Действительно ли переупорядочение полезной концепцией для рассуждений по многопоточной программе?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Действительно ли переупорядочение полезной концепцией для рассуждений по многопоточной программе?

Сообщение Anonymous »

Рассмотрим этот типичный пример: < /p>

Код: Выделить всё

// Thread 1:
r1 = y.load(std::memory_order_relaxed); // A
x.store(r1, std::memory_order_relaxed); // B
// Thread 2:
r2 = x.load(std::memory_order_relaxed); // C
y.store(42, std::memory_order_relaxed); // D
Возможный выход - r1 == r2 == 42 . Большинству людей нравится использовать «переупорядочение» для интерпретации этого примера. Например, интерпретация может быть похожа на: d и переупорядочивается, как если бы d выполняется до , а другие операторы выполняются в порядке, как они появляются в исходном файле. Это звучит так, будто существует глобальная координата, которую мы можем сравнить выполнения в нескольких потоках. Или, поток 1 может наблюдать, как D в потоке 2 выполняется, и распознать, что d выполняется до само по себе. Я думаю, что «переупорядочение» может усугубить ситуацию при рассуждении о программах. Другими словами, если поток 2 не достигает прогресса в D , не может быть побочного эффекта на объекте y . Более того, сказав, что d и переупорядочиваются так, что d выполняется до того, как звучит так, как будто эти два потока выполняются при провале с помощью одного физического ЦП; Тем не менее, это не определена стандартом ISO C ++. Эти два потока, вероятно, выполняются двумя физическими процессорами соответственно; то есть выполнения в потоке 1 и выполнения в потоке 2 не имеют значения, поскольку они не имеют помех друг с другом. и d только что поделились тем же местоположением памяти; Они выполняются различными потоками, поток 1 не заботится и не может распознать, как выполняется d . Единственная полезная вещь заключается в том, является ли побочный эффект, вызванный выполнением d , виден для , который зависит от «случается, прежде чем» (для неатомных и атомных объектов, плюс [Intro.races] P10 и когерентные правила для атомных объектов).
Кроме того, что DI-код> выполняется. D виден в . [intro.excution] P8 говорит: < /p>

секвенировано перед тем, как асимметричная, переходная, парная связь между оценками, выполняемыми одним потоком < /strong> ([Intro.multithRead]), который индуцирует частичный порядок между этими оценками. Учитывая любые две оценки A и B, если A секвенированы перед B (или, эквивалентно, B секвенирует после A), то выполнение A должно предшествовать выполнению B .

. и b выполняются одним потоком. Это неправильно сделать вывод из обратного. То есть мы не можем сказать: если выполнение предшествующего выполнения B, то A секвенирует перед B таким образом, что A видно для B. С этого момента «переупорядочение» является бессмысленным. Я думаю, что это источник, который при упоминании «x выполняется», «подразумевает» y выполнен », люди интуитивно установили бы порядок между x и y из -за« применяется к исполнению, и приходит к выводу, что «y» происходит до «x». это требует контр-защитника. Например: < /p>

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
int main(){
std::atomic v = 0;
std::atomic flag = false;
std::thread t1([&](){
while(!flag.load(std::memory_order::relaxed)){}  // #1
assert(v.exchange(2,std::memory_order::relaxed) == 1);  // #2
});
std::thread t2([&](){
if(v.exchange(1,std::memory_order::relaxed) == 0){ // #3
flag.store(true, std::memory_order::relaxed); // #4
}
});
t1.join();
t2.join();
}
Чтобы доказать, что #2 никогда не сбои, нам нужен противоположность, где условие в if является false. То есть выполнение #4 может повлиять на то, может ли #2 быть доступным. #2 доступен только после #1 выходов; Этот вывод регулируется [intro.excution] p8. < /p>
Если мы использовали «переупорядочение» или связали порядок с точки зрения стандарта ISO C ++ с выполнением выражений, это принесет некоторую путаницу. Например, Can #2 и #3 переупорядочение, которое, в свою очередь, необходимо рассмотреть, что #2 может переупорядочить по заказу в потенциально бесконечном цикле на #1 и т. Д.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... -reasoning
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»