Size: a a a

2020 August 19

m

magras in pro.cxx
Liber Azerate
Хорошо, тогда, с учётом sequential  consistency и того, что a и b джойнятся До c и d, значение z всегда должно быть 2. Это не так
Нет, стандарт гарантирует что z==1 потому что sequential consistency гарантирует global order.
источник

ПК

Побитый Кирпич... in pro.cxx
Liber Azerate
Хорошо, тогда, с учётом sequential  consistency и того, что a и b джойнятся До c и d, значение z всегда должно быть 2. Это не так
У меня 2
источник

LA

Liber Azerate in pro.cxx
А если перезапустить несколько раз, попадётся и 1
источник

ПК

Побитый Кирпич... in pro.cxx
Если добавить std::cout << z << std::endl; в конец main-а?
источник

LA

Liber Azerate in pro.cxx
Побитый Кирпич
Если добавить std::cout << z << std::endl; в конец main-а?
Вместо assert-а, короче говоря
источник

ПК

Побитый Кирпич... in pro.cxx
Liber Azerate
Вместо assert-а, короче говоря
Ну у меня не попалось 1, запускал > 10 раз
источник

LA

Liber Azerate in pro.cxx
Побитый Кирпич
Ну у меня не попалось 1, запускал > 10 раз
Да и я писал std::cout << z.load();
источник

m

magras in pro.cxx
magras
Нет, стандарт гарантирует что z==1 потому что sequential consistency гарантирует global order.
Да, я не прав. Думал о немного другом примере, где инкремент происходит только при определенном порядке выставления флагов x и y.
источник

ПК

Побитый Кирпич... in pro.cxx
Liber Azerate
Да и я писал std::cout << z.load();
Всё равно всегда 2
источник

LA

Liber Azerate in pro.cxx
Побитый Кирпич
Всё равно всегда 2
У меня с первого запуска 1 выскочил, могу кинуть в лс, если уж на то пошло
источник

m

magras in pro.cxx
Там гонка между read_x_then_y и read_y_then_x. Один из них может не инкрементить z.
источник

LA

Liber Azerate in pro.cxx
magras
Там гонка между read_x_then_y и read_y_then_x. Один из них может не инкрементить z.
Это как раз понятно. Я и сказал, что вопрос не в том, как работает sequential consistency
источник

ПК

Побитый Кирпич... in pro.cxx
Liber Azerate
У меня с первого запуска 1 выскочил, могу кинуть в лс, если уж на то пошло
https://wandbox.org/permlink/VcoBHD8kvBOhItLD

Ну вот тебе вандбокс, попробуй словить там 1
источник

ПК

Побитый Кирпич... in pro.cxx
Хотя если там гонка, то тогда да, такое возможно. Но это никак не противоречит моим словам про join
источник

LA

Liber Azerate in pro.cxx
Побитый Кирпич
https://wandbox.org/permlink/VcoBHD8kvBOhItLD

Ну вот тебе вандбокс, попробуй словить там 1
Словил
источник

ПК

Побитый Кирпич... in pro.cxx
Liber Azerate
Словил
https://t.me/ProCxx/400588

Вот на это отвечай
источник

m

magras in pro.cxx
Побитый Кирпич
https://wandbox.org/permlink/VcoBHD8kvBOhItLD

Ну вот тебе вандбокс, попробуй словить там 1
sleep пере любым из write: https://wandbox.org/permlink/VcoBHD8kvBOhItLD
источник

LA

Liber Azerate in pro.cxx
magras
Там гонка между read_x_then_y и read_y_then_x. Один из них может не инкрементить z.
Там в любом случае по итогу выполнения потоков будет 2, иначе там просто был бы бесконечный цикл и всё
источник

LA

Liber Azerate in pro.cxx
Просто в момент z.load() не всегда видно ещё значение 2. Что значит join() ни разу не заставляет поток выполниться в момент его вызова. Точнее блокировать поток выполнения, пока поток не выполнится
источник

ПК

Побитый Кирпич... in pro.cxx
Liber Azerate
Просто в момент z.load() не всегда видно ещё значение 2. Что значит join() ни разу не заставляет поток выполниться в момент его вызова. Точнее блокировать поток выполнения, пока поток не выполнится
Думаю всё же у тебя неверный вывод
источник