Size: a a a

2020 October 08

AK

Andrei K in pro.cxx
Alex
если её не надо делать под локом, то получается, что этот мьютекс лочится только в одном потоке (в моём случае, поскольку wait() делается только одним потоком), а мьютекс в единственном потоке - бесполезная глупость
Всё так. Cv просто предназначены не для этого. А лок нужен, для защиты от spurious wake ups
источник

A

Alex in pro.cxx
Dmitry Sokolov
Так с cv не нужен atomic. Оно вообще всегда связано с mutex, например в том же POSIX: https://www.opennet.ru/man.shtml?topic=pthread_cond_wait
МНЕ нужен атомик. Поэтому МНЕ не нужен тот мьютекс, который идёт в комплекте с cv.
источник

AK

Andrei K in pro.cxx
Потому что если тред случайно проснётся на cv, и не захватит лок — будет рейс кондишн.
источник

A

Alex in pro.cxx
Andrei K
Всё так. Cv просто предназначены не для этого. А лок нужен, для защиты от spurious wake ups
так от этого нет защиты, spurious wake ups случаются и нужно быть к этому готовым, разве нет?
источник

d

disba1ancer in pro.cxx
Andrei K
Всё так. Cv просто предназначены не для этого. А лок нужен, для защиты от spurious wake ups
Если бы он реально защищал в стандарте бы про это не было бы ни намёка
источник

A

Alex in pro.cxx
Andrei K
Потому что если тред случайно проснётся на cv, и не захватит лок — будет рейс кондишн.
почему? гонка кого с кем?
источник

AK

Andrei K in pro.cxx
Alex
так от этого нет защиты, spurious wake ups случаются и нужно быть к этому готовым, разве нет?
Всё верно.
источник

AK

Andrei K in pro.cxx
Но мьютекс сам по себе не для cv нужен.
источник

AK

Andrei K in pro.cxx
А для проверки condition-а.
источник

d

disba1ancer in pro.cxx
Alex
МНЕ нужен атомик. Поэтому МНЕ не нужен тот мьютекс, который идёт в комплекте с cv.
А процессор поберечь не хотим?
источник

A

Alex in pro.cxx
У меня всего два потока, в одном notify(), в другом wait. Получается, что этот мьютекс вообще не нужен? Тогда нужно сделать специальный cv_no_op_mutex, который ничего не делает, и передавать его в cv. Именно чтобы поберечь процессор и здравый смысл.
источник

d

disba1ancer in pro.cxx
Alex
У меня всего два потока, в одном notify(), в другом wait. Получается, что этот мьютекс вообще не нужен? Тогда нужно сделать специальный cv_no_op_mutex, который ничего не делает, и передавать его в cv. Именно чтобы поберечь процессор и здравый смысл.
Надо было в стд виндовые ивенты пропихнуть всем на зло
источник

AK

Andrei K in pro.cxx
В обычном юзкейсе мы спим на cv, если мы просыпаемся, то мы захватываем лок и проверяем условие. Если условие не выполнилось мы спим дальше. Эта проверка нужна лишь для того, чтобы побороть spurious wakeups, поскольку нет гарантий, что мы проснулись именно из-за нотифая. Если есть возможность проверять условие не используя лок (например атомик) это тоже нормально.
источник

AK

Andrei K in pro.cxx
И лок в такой ситуации не нужен вообще.
источник

A

Alex in pro.cxx
так зачем тогда сама cv требует лок? Чтобы разлочить перед самым засыпанием?
источник

A

Alex in pro.cxx
из предположения, что он нужен мне в других потоках?
источник

AK

Andrei K in pro.cxx
Зачем она требует в стандартной библиотеке?
источник

A

Alex in pro.cxx
да, в std::condition_variable
источник

AK

Andrei K in pro.cxx
А окей, возможно потому, что ситуация когда условие надо проверять под локом — гораздо более частая ситуация, чем условие, которое не надо.
источник

d

disba1ancer in pro.cxx
Alex
так зачем тогда сама cv требует лок? Чтобы разлочить перед самым засыпанием?
Наверное, потому что под капотом мьютекс и простая переменная может быть, и роль того, что держит поток в состоянии сна, выполняет мьютекс
источник