Применяется ли первое ограничение в [atomics.order] p4 к заборам?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Применяется ли первое ограничение в [atomics.order] p4 к заборам?

Сообщение Anonymous »

[atomics.order] p4 сообщает, что

Существует один общий порядок S для всех операций Memory_order​::​seq_cst, включая ограничения, который удовлетворяет следующим ограничениям. Во-первых, если A и B — операции Memory_order​::​seq_cst и A строго предшествует B, то A предшествует B в S.

Например:

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

#include 
int main(){
std::atomic v;
v.store(1); // A
std::atomic_thread_fence(std::memory_order::seq_cst); // B
}
Является ли ограждение в B так называемой операцией Memory_order​::​seq_cst? Таким образом, мы можем сделать вывод, что A < B в одном общем порядке S?
Ответ на приведенный выше вопрос является предпосылкой для обоснования следующего примера, лакмусовой бумажки переупорядочения StoreLoad, где второй поток заменяет нагрузку SC на ограждение SC и расслабленную нагрузку:

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

#include 
#include 
#include 
int main() {
std::atomic v = 0;
std::atomic v2 = 0;
int c1 = 0, c2 = 0;
auto t1 = std::thread([&]() {
v.store(1); // #1
c1 = v2.load(); // #2
});
auto t2 = std::thread([&]() {
v2.store(1); // #3
std::atomic_thread_fence(std::memory_order::seq_cst); // #4
c2 = v.load(std::memory_order::relaxed); // #5
});
t1.join();
t2.join();
if (c1 == 0) {
assert(c2 == 1);
}
}
Я хочу доказать, что это утверждение никогда не подведет. Мои рассуждения следующие: читается как 0 подразумевает, что #2 упорядочен по связности перед #3, в соответствии со вторым ограничением и маркером 1

Во-вторых, для каждой пары атомарных операций A и B над объектом M, где A упорядочен по связности перед B, S должен удовлетворять следующим четырем условиям:
  • если A и B являются операциями Memory_order​::​seq_cst, то A предшествует B в S; и

Следовательно, #2 < #3. Затем, предполагая, что #5 читается как 0, это означает, что #5 упорядочен по согласованности перед #1, а #4 происходит до #5, согласно пункту 3

, если ограничение Memory_order​::​seq_cst X происходит до того, как A и B являются Memory_order​::​seq_cst операция, то X предшествует B в S; и

Следовательно, #4 < #1. Важным моментом является то, применимо ли первое ограничение к забору. Если да, мы можем сделать вывод, что #3 < #4 в S, а затем вывести противоречие #4 < #1 < #2 < #3 < #4, которое представляет собой неверный общий порядок. Это делает предполагаемое выполнение невозможным. Другими словами, утверждение никогда не дает сбоя.
Итак, применимо ли первое ограничение к ограждению?

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

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

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

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

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

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