Size: a a a

2020 October 08

ПК

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

m

magras in pro.cxx
Ofee
В зависимости от того, что понимается под генерацией уникальных имён, эту роль тоже могут выполнить лупхолы (точнее, генерация уникального типа, но мне трудно представить ещё какой-то юзкейс)

Можно было бы сказать, что это плохой инструмент, но и генерация уникальных имён – такая себе задача
Для переменных тоже бывает полезно. Те же "безымянные" scope_guard'ы.
источник

ПК

Побитый Кирпич... in pro.cxx
Alex
хотя notify тут без лока
Notify вроде не лочат
источник

m

magras in pro.cxx
Ofee
В зависимости от того, что понимается под генерацией уникальных имён, эту роль тоже могут выполнить лупхолы (точнее, генерация уникального типа, но мне трудно представить ещё какой-то юзкейс)

Можно было бы сказать, что это плохой инструмент, но и генерация уникальных имён – такая себе задача
Честно говоря не могу сообразить где нужные уникальные имена для типов. Та же регистрация компонентов тоже вроде через уникальные глобальные переменные делается, а не через типы.
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Честно говоря не могу сообразить где нужные уникальные имена для типов. Та же регистрация компонентов тоже вроде через уникальные глобальные переменные делается, а не через типы.
Уникальные типы и щас уже можно (см. лямбды)
источник

O

Ofee in pro.cxx
magras
Честно говоря не могу сообразить где нужные уникальные имена для типов. Та же регистрация компонентов тоже вроде через уникальные глобальные переменные делается, а не через типы.
Из последнего, что приходил в голову – можно реализовать priority_tag с автоматическим инкрементом. Или генерация уникальных функций для взаимодействия с C API, если нельзя передать контекст
источник

CD

Constantine Drozdov in pro.cxx
Ofee
Из последнего, что приходил в голову – можно реализовать priority_tag с автоматическим инкрементом. Или генерация уникальных функций для взаимодействия с C API, если нельзя передать контекст
для уникальных функций придумали лямбды
источник

O

Ofee in pro.cxx
Constantine Drozdov
для уникальных функций придумали лямбды
До C++20 – не совсем тот случай, который я имел ввиду. Я про, например, Callback Connector + автоматическую генерацию уникального тега. В C++17 и ниже, кажется, на лямбдах это было не реализуемо
источник

O

Ofee in pro.cxx
Но так или иначе, это был пример решения, частично реализуемого современным C++ без препроцессора, будь то с помощью лупхолов или лямбд
источник

DS

Dmitry Sokolov in pro.cxx
Alex
Возвращаясь к моему вопросу о cv: не поставил фигурные скобки (скоуп лока) - получил дедлок. Офигенный дизайн.

m_bTerminate = true;

{
 std::unique_lock<std::mutex> lk(m_cvMutex);
 m_cv.notify_all();
}

if (m_thread.joinable())
 m_thread.join();
cv же не просто для нотификации, а для нотификации о чём то, что меняется под мьютексом и что ждущий может сразу проверить проснувшись. Например тут m_bTerminate не то ли что проверяет m_thread?
источник

DS

Dmitry Sokolov in pro.cxx
Dmitry Sokolov
cv же не просто для нотификации, а для нотификации о чём то, что меняется под мьютексом и что ждущий может сразу проверить проснувшись. Например тут m_bTerminate не то ли что проверяет m_thread?
Например можно сделать аналог autoreset event как комбинацию bool + mutex + cv. SetEvent устанавливает состояние в true и нотифицирует. WaitEvent ждёт пока не получит состояние true и сбрасывает его (autoreset), пробуждая ровно один поток.
источник

A

Alex in pro.cxx
Dmitry Sokolov
cv же не просто для нотификации, а для нотификации о чём то, что меняется под мьютексом и что ждущий может сразу проверить проснувшись. Например тут m_bTerminate не то ли что проверяет m_thread?
То, но это atomic_bool. Мне не нужен мьютекс. Если notify не должен быть под этим локом, то что получается, самой cv он тоже не нужен?
источник

DS

Dmitry Sokolov in pro.cxx
Alex
То, но это atomic_bool. Мне не нужен мьютекс. Если notify не должен быть под этим локом, то что получается, самой cv он тоже не нужен?
> Even if the shared variable is atomic, it must be modified under the mutex in order to correctly publish the modification to the waiting thread.
источник

A

Alex in pro.cxx
Dmitry Sokolov
> Even if the shared variable is atomic, it must be modified under the mutex in order to correctly publish the modification to the waiting thread.
Да ну нет, atomic предполагает memory barrier, с атомиками как раз нет проблем с видимостью изменений в других потоках
источник

AK

Andrei K in pro.cxx
Не надо делать нотифай под локом. Это плохо для перформанса.
источник

AK

Andrei K in pro.cxx
Это вызывает проблемы только на мак ос икс, пятилетней давности.
источник

DS

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

AK

Andrei K in pro.cxx
Нотифай под локом — это практически всегда гарантированное просыпание треда на той стороне и упирание в лок.
источник

d

disba1ancer in pro.cxx
Danya
Тебе нельзя называть что либо в твоём коде, начинающееся с __ или _ и заглавной буквы
Разработчикам стандартной библиотеки можно
_getch и тебе можно сделать, потому что оно не подпадает под эти правила
Добавлю по поводу __ не только то что начинается, но и ещё идентификаторы которые просто содержат двойное подчёркивание
источник

A

Alex in pro.cxx
Andrei K
Не надо делать нотифай под локом. Это плохо для перформанса.
если её не надо делать под локом, то получается, что этот мьютекс лочится только в одном потоке (в моём случае, поскольку wait() делается только одним потоком), а мьютекс в единственном потоке - бесполезная глупость
источник