Size: a a a

2020 October 08

AT

Anatoly Tomilov in pro.cxx
function scope static constexpr константы попадают туда же, куда и namespace scope? Или они аналог inline в namespace scope (constexpr в namespace scope подразумевает inline)?
источник

AT

Anatoly Tomilov in pro.cxx
Допустим из inline функции возвращаю указатель на такую константу.
источник

DS

Dmitry Sokolov in pro.cxx
Alex
и проверяет атомик флаг terminate, чтобы завершить поток по требованию
А на cv с таймаутом сидит? Работа то у него откуда берётся, периодическая?
источник

A

Alex in pro.cxx
Конечно, с таймаутом. wait() без таймаута - врата в ад, это ошибка независимо от логики работы потока, и того, что он ожидает (проверено уже не раз).
источник

DS

Dmitry Sokolov in pro.cxx
Alex
Конечно, с таймаутом. wait() без таймаута - врата в ад, это ошибка независимо от логики работы потока, и того, что он ожидает (проверено уже не раз).
Да нет ничего страшного в wait без таймаута :) Ну т.е. тут cv используется ещё и как таймер. Так значит он встаёт на wait только когда хочет поспать... И какой смысл тут экономить на локах?
источник

A

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

А вопрос был не в экономии, а в понимании принципиа корректного использования cv. Потому что глядя на дизайн, можно подумать, что лок ей необходим для работы.
источник

DS

Dmitry Sokolov in pro.cxx
Alex
Страшно то, что когда доходит дело до завершения программы (или подсистемы) и остановки потоков, на wait можно встать бесконечно и уже не выйти, если он без таймаута.

А вопрос был не в экономии, а в понимании принципиа корректного использования cv. Потому что глядя на дизайн, можно подумать, что лок ей необходим для работы.
Лок удобен для работы. И да, необходим в том же POSIX. Например чаще же наверное будет условие наподобие "выходи" или "есть чо поработать", уже совсем не атомик.
источник

A

Alex in pro.cxx
Я понимаю, что юзеру может быть нужен лок. А может и не быть. А вот зачем он самой cv - не понимаю.
источник

A

Alex in pro.cxx
и при чём здесь posix, если мы говорим про std? интерфейс и правильное использование std::cv должны быть одинаковы на всех платформах
источник

A

Alex in pro.cxx
если на какой-то платформе нужно лочить cv перед вызовом notify, то это должно быть в примерах, но этого нет
источник

ПК

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

А вопрос был не в экономии, а в понимании принципиа корректного использования cv. Потому что глядя на дизайн, можно подумать, что лок ей необходим для работы.
Дак на джойне потоков то же самое
источник

AN

Alexander N in pro.cxx
Miss Очепятка
Это неважно. write может вернуть ошибку если не справился с посылкой и тогда данные досылаются.  Суть в том чно на приеме у меня проскакивает 0x5e 0х40 - которые не отправляю.
Надо поковырять flow conrol/стоп биты итд
источник

ПК

Побитый Кирпич... in pro.cxx
Таймаут в таком случае выглядит как костыль. Типа у меня баг в программе и она зависает на выходе, но я вместо того чтоб его пофиксить впилю костыль, чтоб баг не больно проявлялся
источник

A

Alex in pro.cxx
Наверное, можно извратиться как-то с локами, чтобы не нужен был таймаут, но это именно что извращение, и у меня в голове такой код не вырисовывается. Обычно делается так, и это не только мой код (до того, как я понял, что это ошибка), но и у других людей видел то же самое.

Поток А - хозяин потока В:
~A() {
  _bTerminateThread = true;
  _cv.notify_all();
  _thread.join();
}

Поток B:
void B::threadFunc() {
  while (!_bTerminate) {
     do_work();
     if (_bTerminate)
       return;
     _cv.wait(condition());
 }
}
источник

A

Alex in pro.cxx
и этот код прекрасно работает, пока не нужно завершить поток, на чём он может бесконечно зависнуть
источник

A

Alex in pro.cxx
и даже лишняя проверка terminate перед wait() от этого не спасает, поэтому её можно убрать, а вот wait обязан быть с разумным таймаутом
источник

ПК

Побитый Кирпич... in pro.cxx
Alex
Наверное, можно извратиться как-то с локами, чтобы не нужен был таймаут, но это именно что извращение, и у меня в голове такой код не вырисовывается. Обычно делается так, и это не только мой код (до того, как я понял, что это ошибка), но и у других людей видел то же самое.

Поток А - хозяин потока В:
~A() {
  _bTerminateThread = true;
  _cv.notify_all();
  _thread.join();
}

Поток B:
void B::threadFunc() {
  while (!_bTerminate) {
     do_work();
     if (_bTerminate)
       return;
     _cv.wait(condition());
 }
}
Чёт не увидел проблем
источник

A

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

ПК

Побитый Кирпич... in pro.cxx
Дак где трабла?
источник

A

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