Size: a a a

2020 October 08

DS

Dmitry Sokolov in pro.cxx
Alex
в том, что поток А делает notify()  до того, как поток В начал ожидать. Поэтому он уже не может проснуться, а join висит вечно - dead lock
// control
unique_lock lock(mtx);
terminate = true;
lock.unlock();
cv.notify_all();


// worker
for(;;) {
   unique_lock lock(mtx);
   if(terminate)
       return;
   cv.wait_for(lock, seconds(1));
   if(terminate)
       return;
   lock.unlock();
   do_work();
}
источник

ПК

Побитый Кирпич... in pro.cxx
Alex
в том, что поток А делает notify()  до того, как поток В начал ожидать. Поэтому он уже не может проснуться, а join висит вечно - dead lock
Для этого в wait передают лямбду с условием, не?
источник

A

Alex in pro.cxx
нет, вообще никакой связи
источник

ПК

Побитый Кирпич... in pro.cxx
Если ты условие удовлетворишь до нотифая, то оно проверится при wait и сразу выйдет
источник

ПК

Побитый Кирпич... in pro.cxx
Ты как раз так и делаешь
источник

A

Alex in pro.cxx
Dmitry Sokolov
// control
unique_lock lock(mtx);
terminate = true;
lock.unlock();
cv.notify_all();


// worker
for(;;) {
   unique_lock lock(mtx);
   if(terminate)
       return;
   cv.wait_for(lock, seconds(1));
   if(terminate)
       return;
   lock.unlock();
   do_work();
}
вот это, может, и сработает, у меня уже нет сил вникать. ИМХО ручной анлок - опасный антипаттерн, лучше я поставлю таймаут и не буду извращаться и усложнять код
источник

A

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

DS

Dmitry Sokolov in pro.cxx
Alex
wait не атомарен, потому условие ничего не решает, только может уменьшить вероятность дедлока
Ну вот как раз работа для mutex :) condition меняется под lock и проверяется перед/после wait - точно не пропустишь.
источник

A

Alex in pro.cxx
да, логично, разобрался. Но это не обязан быть тот же лок, который уходит в cv?
источник

DS

Dmitry Sokolov in pro.cxx
Alex
да, логично, разобрался. Но это не обязан быть тот же лок, который уходит в cv?
Но он же как раз в wait его отпускает и на выходе из wait захватывает.
источник

A

Alex in pro.cxx
Начинает проясняться, спасибо. Т. е. самой cv этот лок абсолютно не нужен, а интерфейс такой сделан для удобства моей работы с cv?
источник

DS

Dmitry Sokolov in pro.cxx
Alex
Начинает проясняться, спасибо. Т. е. самой cv этот лок абсолютно не нужен, а интерфейс такой сделан для удобства моей работы с cv?
Ну теоретически может и нужен, например если там какое-то внутреннее состояние меняется под этим (предположительно заблокированным) мьютексом. Или логика как-то зависит от него через happens-before.

Кстати condition_variable_any тож не обходится без std::mutex (кроме BasicLockable) :) Просто он внутре сидит.
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/condition_variable#L261

А ещё в gcc немного поломатый wait_for, был вообще только на system_clock, сейчас чот условно приделали при наличии новомодного pthread_cond_clockwait, хотя pthread_condattr_setclock вроде то же самое делает.
Я такую вот заплатку пользую: https://github.com/bibmaster/condition_variable/blob/master/condition_variable.hpp
источник

DS

Dmitry Sokolov in pro.cxx
Alex
Начинает проясняться, спасибо. Т. е. самой cv этот лок абсолютно не нужен, а интерфейс такой сделан для удобства моей работы с cv?
Вот например, https://code.woboq.org/userspace/glibc/nptl/pthread_cond_wait.c.html#394
>  We do need acquire MO  to synchronize with group reinitialization in   __condvar_quiesce_and_switch_g1.
Что бы это ни значило :)
источник

АР

Андрей Руссков... in pro.cxx
git blame & email? )
источник

DS

Dmitry Sokolov in pro.cxx
Вобще в POSIX не хватает всё  таки простого relative wait. Получается я например прибавляю таймаут к clock_gettime(CLOCK_MONOTONIC). А оно внутре из abstime вычитает тот же clock_gettime(CLOCK_MONOTONIC) чтобы дернуть с таймаутом futex_reltimed_wait_cancelable. А c relative wait вообще бы ни один clock_gettime не понадобился.
источник

DS

Dmitry Sokolov in pro.cxx
Причём объяснение abstime семантики сводится к тому что а вот если был бы relative то с ожиданием абсолютного времени так неудобно... Как будто нельзя было две функции сделать.
источник

L

Lee Armstrong in pro.cxx
Кто-нибудь уже пробовал намутить корутины на библиотеке libuv? Что бы как nodejs, только node++
источник

Miss Очепятка... in pro.cxx
Alexander N
Надо поковырять flow conrol/стоп биты итд
Написал клиента на nodejs полёт нормальный. Видимо дело в qt. Или в flowcontrol
источник

ПК

Побитый Кирпич... in pro.cxx
Lee Armstrong
Кто-нибудь уже пробовал намутить корутины на библиотеке libuv? Что бы как nodejs, только node++
А там есть отличия от буст асио?
источник

L

Lee Armstrong in pro.cxx
Побитый Кирпич
А там есть отличия от буст асио?
Хрен знает
источник