Как сделать вывод, действительна ли глобальная последовательность или не с помощью std :: memory_order_seq_cst?C++

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

Сообщение Anonymous »

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

#include 
#include 
#include 
#include 

std::atomic x {}, y {};

void write_x_and_y() {
x.store(1, std::memory_order_seq_cst);    // 1
y.store(-1, std::memory_order_relaxed);    // 2
}
void read_x_then_y() {
while(x.load(std::memory_order_seq_cst) not_eq 1);    // 3
assert(y.load(std::memory_order_seq_cst) < 0);    // 4
}
int main(int argc, char *argv[]) {
A: std::thread t1(write_x_and_y), t2(read_x_then_y);
t1.join();
t2.join();
goto A;
}
< /code>
Во -первых, переупорядочение никогда не рассматривается. Потому что, если 2 
переупорядочен, и это происходит до 1 , расслабленное магазин 2 будет синхронизировано при выпуске операции 1 . Мы можем видеть, что (A происходит до того, как B будет помечен как A-> b)
  • Если 1 не произошло, 3 и 4 никогда не произойдет, поэтому мы можем предположить, что 1 произойдет до 3 . У нас есть 1-> 3 и 1-> 4 ;
  • В потоках T1 и T2 , мы имеем 1-> 2 и 3-> 4 .
Таким образом : 1-> 2-> 3-> 4 ;
[*] Последовательность S2: 1-> 3-> 2-> 4 ;
[*] Последовательность S3: 1-> 3-> 4-> 2 .

in s1 и s2, asd. S3 не является действительной глобальной последовательности. Мое мнение очень простое, расслабленное магазин может показаться в глобальной последовательности, только если некоторые операции нагрузки видят значение. В порядке S3, никто не видит результат y.store (-1) , поэтому 2 не может быть показан в глобальной последовательности.
Я спросил Chatgpt. Chatgpt дал мне тщательный анализ, но ответ смутил меня. Но я не могу найти кольцо в 1-> 3-> 4-> 2 , может быть, Chatgpt означает

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

|--------|
1->3->4->2
< /code>
На этом графике невозможно вернуться к стартовому узлу, когда мы пересекаем от стартового узла. А затем Chatgpt сказал, что определение цикла в глобальной последовательности отличается от определения в теории графика. Наконец, Chatgpt сказал, что вы можете перечислить все заказы и выравнивать их, если вы найдете < /p>
Order O1 : 1->3->4->2
Order O2 : 1->2
2 comes after 4 in O1 but 2 comes before 4 in O2,
Последовательность 1-> 3-> 4-> 2 является недействительной ??? Я всегда чувствую, что этот метод очень произвольный и не имеет строгого.

Подробнее здесь: https://stackoverflow.com/questions/796 ... y-order-se
Ответить

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

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

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

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

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