Size: a a a

2020 August 19

ПК

Побитый Кирпич... in pro.cxx
Ты ждёшь на Join-ах выполнение этой гарантии а потом проверяешь
источник

LA

Liber Azerate in pro.cxx
Побитый Кирпич
Дак если есть такая гарантия, то откуда вопросы?
Так а почему потоки должны начать выполняться до загрузки z, а если выполнить join() после assertion-a, то оно всегда проваливается?
источник

LA

Liber Azerate in pro.cxx
Побитый Кирпич
Ты ждёшь на Join-ах выполнение этой гарантии а потом проверяешь
join() ведь о скоупе а не точке его вызова
источник

ПК

Побитый Кирпич... in pro.cxx
Liber Azerate
Так а почему потоки должны начать выполняться до загрузки z, а если выполнить join() после assertion-a, то оно всегда проваливается?
Потоки выполняются до загрузки z, потому что join до загрузки z
источник

ПК

Побитый Кирпич... in pro.cxx
join вроде делает happens before гарантию
источник

ПК

Побитый Кирпич... in pro.cxx
То есть ты гарантированно дождёшься окончания потока (в которм как ты сказал есть гарантия ++z)
источник

m

magras in pro.cxx
Liber Azerate
Так а почему потоки должны начать выполняться до загрузки z, а если выполнить join() после assertion-a, то оно всегда проваливается?
Трэды не мгновенно стартуют. Добавив sleep перед асертом наверняка можно добиться флаков.
источник

LA

Liber Azerate in pro.cxx
Побитый Кирпич
Потоки выполняются до загрузки z, потому что join до загрузки z
Не логично. join() говорит, что мы не выйдем из скоупа, пока потоки не выполнятся. Всё. Он не говорит, что потоки выполнятся в точке вызова. Или я неправ?
источник

ПК

Побитый Кирпич... in pro.cxx
Liber Azerate
Не логично. join() говорит, что мы не выйдем из скоупа, пока потоки не выполнятся. Всё. Он не говорит, что потоки выполнятся в точке вызова. Или я неправ?
Он говорит что поток будет завершён сразу после вызова join
источник

LA

Liber Azerate in pro.cxx
magras
Трэды не мгновенно стартуют. Добавив sleep перед асертом наверняка можно добиться флаков.
В общем, просто пример некорректный, да? Автор поставил на то, что функции в потоках почти ничего не делают и гарантировано выполнятся до assertion-a
источник

ПК

Побитый Кирпич... in pro.cxx
t.join();
// <-- тут есть гарантия что функция внутри t выполнена
источник

ПК

Побитый Кирпич... in pro.cxx
Liber Azerate
В общем, просто пример некорректный, да? Автор поставил на то, что функции в потоках почти ничего не делают и гарантировано выполнятся до assertion-a
Они гарантированно выполнятся благодаря join
источник

ПК

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

LA

Liber Azerate in pro.cxx
Побитый Кирпич
t.join();
// <-- тут есть гарантия что функция внутри t выполнена
Хорошо, где это написано?
источник

ПК

Побитый Кирпич... in pro.cxx
Liber Azerate
Хорошо, где это написано?
источник

m

magras in pro.cxx
Liber Azerate
В общем, просто пример некорректный, да? Автор поставил на то, что функции в потоках почти ничего не делают и гарантировано выполнятся до assertion-a
Он корректный. Это гонка. Просто в большинстве случаев она завершается в определенном порядке.
источник

ПК

Побитый Кирпич... in pro.cxx
Blocks the current thread until the thread identified by *this finishes its execution.

Из этого следует гарантия
источник

ПК

Побитый Кирпич... in pro.cxx
The completion of the thread identified by *this synchronizes with the corresponding successful return from join().

Там же
источник

m

magras in pro.cxx
magras
Он корректный. Это гонка. Просто в большинстве случаев она завершается в определенном порядке.
Вернее твой пример с assert'ом после join всегда должен проходить. Я говорил про случай когда assert вынесен до join.
источник

LA

Liber Azerate in pro.cxx
Побитый Кирпич
Blocks the current thread until the thread identified by *this finishes its execution.

Из этого следует гарантия
Хорошо, тогда, с учётом sequential  consistency и того, что a и b джойнятся До c и d, значение z всегда должно быть 2. Это не так
источник