Size: a a a

2020 August 14

ПК

Побитый Кирпич... in supapro.cxx
Алексей Тимошенко
а то что size_ это atomic  не решает проблему? Или я не так понимаю, std::atomic?
А, я не заметил что он атомик
источник

D

Danya in supapro.cxx
Алексей Тимошенко
а то что size_ это atomic  не решает проблему? Или я не так понимаю, std::atomic?
У тебя атомарный инкремент счётчика, а не операция push_back
источник

D

Danya in supapro.cxx
Поток 1: сделал
std::deque<T>::push_back(item);
Поток 2: берёт
size()
источник

D

Danya in supapro.cxx
Не гонка данных, а просто некорректное поведение
источник

ПК

Побитый Кирпич... in supapro.cxx
Алексей Тимошенко
а то что size_ это atomic  не решает проблему? Или я не так понимаю, std::atomic?
Короче загугли пример очереди, в интернете есть
источник

ПК

Побитый Кирпич... in supapro.cxx
С std::condition_variable и т.д.
источник

DV

Dmitry Vedenko in supapro.cxx
Алексей Тимошенко
а то что size_ это atomic  не решает проблему? Или я не так понимаю, std::atomic?
короч у тебя все не правильно
источник

АТ

Алексей Тимошенко... in supapro.cxx
Но я если правильно понял, некорректное поведение произойдет если поток 1 запушит, но не успеет заинкрементить size_, а поток 2 четко в этот момент запросит size()
источник

АТ

Алексей Тимошенко... in supapro.cxx
Переслано от Danya
Поток 1: сделал
std::deque<T>::push_back(item);
Поток 2: берёт
size()
источник

DV

Dmitry Vedenko in supapro.cxx
У тебя вообще мясо может пойти. Ты можешь пуш и поп одновременно сделать
источник

ПК

Побитый Кирпич... in supapro.cxx
Вообще, насколько я знаю, у потокобезопасной очереди нет операций empty() и size(). Потому что они не имеют смысла в многопоточной среде. Максимум есть unsafe_size() с пометкой "юзать только если знаешь что делаешь"
источник

LA

Liber Azerate in supapro.cxx
Побитый Кирпич
Вообще, насколько я знаю, у потокобезопасной очереди нет операций empty() и size(). Потому что они не имеют смысла в многопоточной среде. Максимум есть unsafe_size() с пометкой "юзать только если знаешь что делаешь"
Ну, в реализации в Уильямсе empty есть, насколько я помню
источник

DV

Dmitry Vedenko in supapro.cxx
В теории можно на рекурсивном мьютексе, но обычно нахрен не надо, тут не поспорить
источник

DV

Dmitry Vedenko in supapro.cxx
Потому что все равно бесполезно
источник

DV

Dmitry Vedenko in supapro.cxx
лучше try_pop
источник

DV

Dmitry Vedenko in supapro.cxx
потому что

if (!a.empty()) a.pop ();


все равно не верно будет работать
источник

ПК

Побитый Кирпич... in supapro.cxx
Liber Azerate
Ну, в реализации в Уильямсе empty есть, насколько я помню
видимо это на самом деле был unsafe_empty
источник

D

Danya in supapro.cxx
Побитый Кирпич
Вообще, насколько я знаю, у потокобезопасной очереди нет операций empty() и size(). Потому что они не имеют смысла в многопоточной среде. Максимум есть unsafe_size() с пометкой "юзать только если знаешь что делаешь"
не имеет смысла - потому что оно в следующий момент времени может стать недействительным?
источник

ПК

Побитый Кирпич... in supapro.cxx
Danya
не имеет смысла - потому что оно в следующий момент времени может стать недействительным?
Да
источник

LA

Liber Azerate in supapro.cxx
Побитый Кирпич
видимо это на самом деле был unsafe_empty
Да почему, вполне сейф, с блокировкой. Вот pop-а там не было, правда. Вопрос хороший, конечно, зачем
источник