Как формально доказать, что утверждение никогда не проходит, ссылаясь на соответствующие правилаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как формально доказать, что утверждение никогда не проходит, ссылаясь на соответствующие правила

Сообщение Anonymous »

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

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

#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();
}
< /code>
Простой способ доказать, что утверждение никогда не проходит,-это использовать противоположность. Цель состоит в том, чтобы доказать, что «если утверждение выполнено, условие в if 
должно быть правдой». Эквивалентно, «если условие в if верно, утверждение не будет выполнено». Первое заместимость выполняется. If the else part of the selection statement is present and the condition yields false, the second substatement is executed.

The infinite loop can exit only if its condition loads true according to [stmt.while] p1 says:

In the while statement, the substatement is executed repeatedly until the value of the Условие ([[stmt.pre]) становится ложным.

то есть, должен существовать побочный эффект, который устанавливает флаг true , который управляется [Intro.races] p10

Некоторые неопределенные побочные эффекты A, который изменяет M, где B не происходит до A.

Побочный эффект может быть получен только с помощью оценки в #4 , и что оценка должна быть выполнена для создания побочного эффекта.
, как и сейчас, каждая шаг формального анализа соответствует формальному правилу. Тем не менее, я не могу найти соответствующее формальное правило, которое имеет отношение к «утверждению недоступно/не будет выполнено, если цикл не выходит», которое может получить следующее предложение вместе с вышеуказанными шагами:

, если утверждение было выполнено, условие в if true. Критический шаг в этом формальном противостоянии. Наконец, в соответствии с [atomics.order] p10 < /p>

Операции атомного чтения-модификации-записи всегда должны считывать последнее значение (в порядке модификации), написанного до записи, связанной с операцией по считыванию-модификации. 0 , поэтому RMW на #3 должен прочитать 2 , что приводит к тому, что условие является false , следовательно, предположение неверно.
Итак, где соответствующее правило о «утверждении недоступно/не будет выполнено, если цикл не выходит»?>

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

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

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

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

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

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