Застали падение на крипто рынке? Альты сходили на минус 20-30%. В такие моменты сервера работают с повышенной нагрузкой, траффик с бирж сильно растёт, задержки приходящих пакетов увеличиваются (т.к. биржи не вывозят шквал заявок), а технология проходит настоящую проверку. Частота сердечных сокращений повышается, и HFT сотрудники приходят за свои дески.
👍8
Что почитать по C++ и разработке в целом?
1) [middle] connect() - why are you so slow от Cloudflare.
2) [middle] How to stop Linux threads cleanly.
3) [middle] Semaphores are surprisingly versatile. Жаль, Preshing больше не пишет. Хорошие у него были гайды по concurrency и lock-free.
4) [middle] What a software developer must know about Unicode in 2023. Первый раз встречаю блог, но оформлен он очень круто. Стоит заглянуть.
5) [beginner] Видео от Jason Turner о безопасном использовании std::string_view.
1) [middle] connect() - why are you so slow от Cloudflare.
2) [middle] How to stop Linux threads cleanly.
3) [middle] Semaphores are surprisingly versatile. Жаль, Preshing больше не пишет. Хорошие у него были гайды по concurrency и lock-free.
4) [middle] What a software developer must know about Unicode in 2023. Первый раз встречаю блог, но оформлен он очень круто. Стоит заглянуть.
5) [beginner] Видео от Jason Turner о безопасном использовании std::string_view.
👍8🔥2❤1
Реализовывал подпись транзакций для одной из DEX бирж. Согласно питонячему примеру, мне нужно было сначала сериализовать сообщение msgpack'ом (популярный бинарный формат для сериализации), потом посчитать от него хэш, потом положить его в структуру, опять посчитать хэш по стандарту EIP-712, и наконец подписать. Сама биржа не документирует как делать подпись (ну правильно, зачем), а просто отсылает к реализации подписи на Python. В примере на python делается примерно следующее (это только часть):
Msgpack умеет сериализовывать и питонячьи и C++ контейнеры, но ассоциативные массивы сериализует в порядке их обхода, а порядок обхода со времён Python 3.7 стал insertion-order (т.е. в том порядке, в каком были вставлены в dict, независимо от самого значения ключа). При портировании этого кода на C++ я сначала сериализовал
Возвращаясь к питону и insertion-order: изменение добавили в СPython в качестве оптимизации (а я как-то подзабыл эту новость 7 летней давности, хотя слышал). Внутри двойная структура: первая - хэш-таблица, содержит в качестве значений не сами элементы, а индексы во второй структуре, являющейся массивом (куда значения как раз попадают в insertion порядке). Это обеспечивает ускорение итерации, и стабильный порядок обхода (что довольно приятно в некоторых ситуациях), и уменьшенный memory footprint (за счёт уменьшения хэш-таблицы).
Здесь мейнтейнер питоняки Raymond Hettinger рассказывает подробнее, как эволюционировала реализация:
www.youtube.com/watch?v=p33CVV29OG8
Довольно интересно.
msg = {"pair_id": pair_id, "is_buy": is_buy, "price": str(price), "size": str(size)}
packed = msgpack.packb(msg)
hash = keccak256(packed)
Msgpack умеет сериализовывать и питонячьи и C++ контейнеры, но ассоциативные массивы сериализует в порядке их обхода, а порядок обхода со времён Python 3.7 стал insertion-order (т.е. в том порядке, в каком были вставлены в dict, независимо от самого значения ключа). При портировании этого кода на C++ я сначала сериализовал
std::map<std::string, msgpack::object>
, что давало другой порядок (не insertion, а sorted), и соответственно другой хэш (а значит транзакция будет отклонена). Unordered_map тоже не подходит, он же "unordered". Немного поворчав, взял низко-уровневый C API, позволяющий сконструировать map вручную в нужном порядке:msgpack_pack_map(p, 4);
msppack_pack_str(p, "pair_id");
msppack_pack_int(p, pair_id);
msppack_pack_str(p, "is_buy");
msppack_pack_bool(p, is_buy);
...
Возвращаясь к питону и insertion-order: изменение добавили в СPython в качестве оптимизации (а я как-то подзабыл эту новость 7 летней давности, хотя слышал). Внутри двойная структура: первая - хэш-таблица, содержит в качестве значений не сами элементы, а индексы во второй структуре, являющейся массивом (куда значения как раз попадают в insertion порядке). Это обеспечивает ускорение итерации, и стабильный порядок обхода (что довольно приятно в некоторых ситуациях), и уменьшенный memory footprint (за счёт уменьшения хэш-таблицы).
Здесь мейнтейнер питоняки Raymond Hettinger рассказывает подробнее, как эволюционировала реализация:
www.youtube.com/watch?v=p33CVV29OG8
Довольно интересно.
YouTube
Modern Dictionaries by Raymond Hettinger
Abstract
Python's dictionaries are stunningly good. Over the years, many great ideas have combined together to produce the modern implementation in Python 3.6. This fun talk is given by Raymond Hettinger, the Python core developer responsible for the set…
Python's dictionaries are stunningly good. Over the years, many great ideas have combined together to produce the modern implementation in Python 3.6. This fun talk is given by Raymond Hettinger, the Python core developer responsible for the set…
👍6❤2
В выходные готовился к воркшопу на C++ Russia 2024: продумывал как лучше объяснять, куда вставить различные нюансы, фишки, объяснения багов, дописывал нюансы в коде, добавлял readme, добавлял опциональные задачи, добавлял комментарии, улучшал тесты, копал тему еще глубже. Репозиторий пока скрыт, но по плану я открою его за сутки до начала.
В рамках воркшопа участники напишут Queue, Latch, RWLock. В качестве "домашнего задания" останется: написать свой Condition Variable на Futex'ах (непростая задача), и Thread Pool на основе написанного Queue. Ближайшие несколько постов будут про воркшоп.
В рамках воркшопа участники напишут Queue, Latch, RWLock. В качестве "домашнего задания" останется: написать свой Condition Variable на Futex'ах (непростая задача), и Thread Pool на основе написанного Queue. Ближайшие несколько постов будут про воркшоп.
👍6✍5
Я вернулся из отпуска и командировки, отдохнул и готов писать дальше. Что произошло за три недели?
Во-первых, я провёл воркшоп на конференции C++ Russia. В целом, всё прошло хорошо: люди были довольны, судя по благодарностям и форме обратной связи. Были технические неполадки (в середине мероприятия пришлось переключить микрофон), и не успели решить две задачи из семи, учту на будущее.
Во-вторых, похоже, что один из преподов OTUS'а решилспиздить вдохновиться воркшопом. Об этом расскажу в следующем посте.
В-третьих, мы в своей небольшой команде выходим на новую крипто-полу-defi-биржу. Это интересное время, которое очень драйвит. Однако результата легко и быстро не получить. Первая реализация обычно не даёт денег, и требует дальнейшей долгой настройки, бэктестов, оптимизаций и исследований.
Во-первых, я провёл воркшоп на конференции C++ Russia. В целом, всё прошло хорошо: люди были довольны, судя по благодарностям и форме обратной связи. Были технические неполадки (в середине мероприятия пришлось переключить микрофон), и не успели решить две задачи из семи, учту на будущее.
Во-вторых, похоже, что один из преподов OTUS'а решил
В-третьих, мы в своей небольшой команде выходим на новую крипто-полу-defi-биржу. Это интересное время, которое очень драйвит. Однако результата легко и быстро не получить. Первая реализация обычно не даёт денег, и требует дальнейшей долгой настройки, бэктестов, оптимизаций и исследований.
Telegram
Один микросек - C++, low latency, concurrency, HFT
Привет! Я готовлю онлайн воркшоп по std::condition_variable на C++ Russia, который пройдёт в мае. Это практический вебинар, в котором после небольшого теоретического введения, вам нужно будет писать C++ код, компилировать и запускать у себя локально, но прямо…
👍8
Теперь об OTUS'е и воркшопе. Как-то случайно я зашел в какой-то плюсовый канал и увидел рекламу открытого вебинара на знакомую тему "Условные переменные". "Интересно посмотреть о чем они расскажут" подумал я, перешёл на сайт и сильно удивился. Текст с описанием вебинара был очень и очень похож на тот, который я писал ранее. Сравните сами на скриншотах.
Я всё еще не могу утверждать, что содержимое будет один в один, ведь сам вебинар я ещё не видел, но ситуация напрягает. Если хочется взять задачи с воркшопа, то можно связаться со мной, спросить разрешения, пообсуждать варианты. Можно и своё сделать, это не что-то секретное.
Репозиторий с задачами, если интересно: https://github.com/Yukigaru/cpprussia-workshop-condition-variable
Я всё еще не могу утверждать, что содержимое будет один в один, ведь сам вебинар я ещё не видел, но ситуация напрягает. Если хочется взять задачи с воркшопа, то можно связаться со мной, спросить разрешения, пообсуждать варианты. Можно и своё сделать, это не что-то секретное.
Репозиторий с задачами, если интересно: https://github.com/Yukigaru/cpprussia-workshop-condition-variable
🤬12😢1
Один микросек - C++, low latency, concurrency, HFT
Теперь об OTUS'е и воркшопе. Как-то случайно я зашел в какой-то плюсовый канал и увидел рекламу открытого вебинара на знакомую тему "Условные переменные". "Интересно посмотреть о чем они расскажут" подумал я, перешёл на сайт и сильно удивился. Текст с описанием…
Со мной связались представители OTUS и сказали, что преподаватель увидел рекламу воркшопа, а потом затеял свой, и описание похоже, потому что "базовые составляющие этой темы плюс минус одни". Говорят, контент будет уникальным. Считаю, вопрос закрыт.
🥴10👍6😐1
А тем временем я затеял несколько воркшопов на новые темы (считай, понравилось, надо повторить). Из идей:
1) concurrency: mutexes (там тоже много интересного можно поделать, хотя казалось бы, мьютексы)
2) std sorting и ordering (sort, partial_sort, stable sort, nth_element, partition, lower/upper_bound, merge, компараторы, parallel sort, priority queue, heap).
3) gdb debugging (различные инструменты, отладка креш дампов, отладка без символов, форматтеры)
... (далее вырезано, чтобы не вдохновлять никого на вебинары с такой же темой)
Считаю, что самым сложным будет самостоятельено привлечь достаточное количество участников. Человек от 10, полагаю, будет достаточно, человек от 20 можно считать успехом. На cpprussia было ~45-50 участников, но у организаторов есть мощнейший ресурс для привлечения, и они даже ограничили количество сверху.
Технически будет так:
- собираемся в онлайн платформе (её подобрать еще нужно)
- даётся немного объяснений
- решаем задачи
- для шустрых есть доп. задачи
- после выдается большая задача на домашную работу
1) concurrency: mutexes (там тоже много интересного можно поделать, хотя казалось бы, мьютексы)
2) std sorting и ordering (sort, partial_sort, stable sort, nth_element, partition, lower/upper_bound, merge, компараторы, parallel sort, priority queue, heap).
3) gdb debugging (различные инструменты, отладка креш дампов, отладка без символов, форматтеры)
... (далее вырезано, чтобы не вдохновлять никого на вебинары с такой же темой)
Считаю, что самым сложным будет самостоятельено привлечь достаточное количество участников. Человек от 10, полагаю, будет достаточно, человек от 20 можно считать успехом. На cpprussia было ~45-50 участников, но у организаторов есть мощнейший ресурс для привлечения, и они даже ограничили количество сверху.
Технически будет так:
- собираемся в онлайн платформе (её подобрать еще нужно)
- даётся немного объяснений
- решаем задачи
- для шустрых есть доп. задачи
- после выдается большая задача на домашную работу
👍16🔥3
В нашем офисе желающим поставили подъемные столы с электромотором. Использую первый день, но предварительно могу сказать, что ощущается очень перспективно. Помогает сохранять бодрость. Не так сильно, как крэши на релизе, но тоже неплохо.
Пошуршал по интернету в поисках исследований, и нашел несколько: 1, 2, 3, 4. Все говорят о том, что standing desks чрезвычайно полезны для юзера:
- снижают субъективные ощущения дискомфорта и боли в спине, шее и плечах
- повышают продуктивность
- способствуют сжиганию жира
- улучшают объективные показатели кардиометаболического здоровья
Пошуршал по интернету в поисках исследований, и нашел несколько: 1, 2, 3, 4. Все говорят о том, что standing desks чрезвычайно полезны для юзера:
- снижают субъективные ощущения дискомфорта и боли в спине, шее и плечах
- повышают продуктивность
- способствуют сжиганию жира
- улучшают объективные показатели кардиометаболического здоровья
😁4👍3
Что почитать по C++ и разработке в целом?
[easy] Comparison of the three implementations of std::string (MSVC, GCC, Clang), с погружением в то, как data(), size(), empty() обрабатывают два состояния (small/large string).
[easy] Какие ошибки есть в коде LLVM от PVS-Studio.
[easy] Практический туториал по x86_64 assembly, если хочется самому написать "hello, world" на asm'е.
[medium] Свежий (2024г) бенчмарк годных хэш-таблиц. Цитата для привлечения внимания: "std::unordered_map: This table is far slower than most of the open-addressing tables in most of the benchmarks".
[hard] How fast are Linux pipes, а так же как они устроены, с погружением в нюансы ядра.
[hard] Книга Сергея Слотина Algorithms for Modern Hardware (не законченная). Оцените по оглавлению, сколько там интересного.
[impostor] Усталось и как с ней справиться - большой, но краткий обзор исследований на тему повышения работоспособности.
[easy] Comparison of the three implementations of std::string (MSVC, GCC, Clang), с погружением в то, как data(), size(), empty() обрабатывают два состояния (small/large string).
[easy] Какие ошибки есть в коде LLVM от PVS-Studio.
[easy] Практический туториал по x86_64 assembly, если хочется самому написать "hello, world" на asm'е.
[medium] Свежий (2024г) бенчмарк годных хэш-таблиц. Цитата для привлечения внимания: "std::unordered_map: This table is far slower than most of the open-addressing tables in most of the benchmarks".
[hard] How fast are Linux pipes, а так же как они устроены, с погружением в нюансы ядра.
[hard] Книга Сергея Слотина Algorithms for Modern Hardware (не законченная). Оцените по оглавлению, сколько там интересного.
[impostor] Усталось и как с ней справиться - большой, но краткий обзор исследований на тему повышения работоспособности.
👍19
htop tips and tricks
> htop -d3
- можно уменьшить интервал обновления, например, до 300мс.t
- включить tree view (при этом сортировка по CPU отключается), с возможностью collapse/expand ветвей курсором.z
- приостановить обновление, полезно, если хочется рассмотреть список процессов подробнее, а он "дергается".F
- follow a process, т.е. выбрать конкретный, чтобы не потерять его при перестроениях списка.a
- установить thread affinity выбранному процессу.s
- посмотреть strace выбранного процесса.l
- отобразить открытые файлы процесса (lsof).space
- выделение процессов, U
- отменить выделение, F9
- отправить процессу сигнал.👍14🔥5✍3
Интересный телеграм канал про разработку и HFT: On the way to 10x engineering. Стартовал примерно в одно время с моим каналом. Кто пишет и из какой компании - неизвестно, но пишет хорошо. Например:
- Speculative trading
- Знакомство с FPGA
- Hard skills in HFT
- Speculative trading
- Знакомство с FPGA
- Hard skills in HFT
👍6
Анонсирую воркшоп "C++ concurrency: condition_variable". Я проводил его на C++ Russia 2024, и тогда было собрано 50 человек, и отзывы были положительные. Теперь собираю участников самостоятельно. Воркшоп пройдёт онлайн в пятницу 12 июля в 19:00 (utc+3), приходите!
Что будет на воркшопе:
- 6 практических задач
- напишете несколько примитивов синхронизации (Latch, Queue, RWLock, call_once, future/promise) на основе CV
- даётся код и нужно дописать реализацию класса или починить баг, всё максимально удобно для работы
- есть дополнительные усложнения для шустрых
- поговорим о том, что такое и когда нужен CV
- обсудим типовые ошибки и как их починить
- будет всё, что могут спросить на собесе на эту тему
Что будет после воркшопа:
- 2-3 задачи на самостоятельную проработку в свободное время
Когда: пятница 12 июля в 19:00 (utc+3)
Стоимость: свободная цена, т.е. выбираете сами от 0 руб до вы оплачиваете мне квартиру.
Зарегистрироваться (опционально)
Добавить в календарь
Что будет на воркшопе:
- 6 практических задач
- напишете несколько примитивов синхронизации (Latch, Queue, RWLock, call_once, future/promise) на основе CV
- даётся код и нужно дописать реализацию класса или починить баг, всё максимально удобно для работы
- есть дополнительные усложнения для шустрых
- поговорим о том, что такое и когда нужен CV
- обсудим типовые ошибки и как их починить
- будет всё, что могут спросить на собесе на эту тему
Что будет после воркшопа:
- 2-3 задачи на самостоятельную проработку в свободное время
Когда: пятница 12 июля в 19:00 (utc+3)
Стоимость: свободная цена, т.е. выбираете сами от 0 руб до вы оплачиваете мне квартиру.
Зарегистрироваться (опционально)
Добавить в календарь
Google Workspace
Google Calendar - Easier Time Management, Appointments & Scheduling
Learn how Google Calendar helps you stay on top of your plans - at home, at work and everywhere in between.
👍20
Про технические моменты по воркшопу:
1) Сервис видео конференций. Нужна поддержка конфы до 3ч, из-за чего не подходят бесплатные версии сервисов. Нужна задержка менее 300мс, из-за чего не подходят Youtube Live (в ultra low latency режиме обещают <5 сек, но это всё еще многовато), и Twitch (10-15 sec). Нужна оплата для пользователей РФ, из-за чего отваливается Google Meet. Cisco Webex в целом недоступна для нас. Microsoft Teams чересчур кроваво-корпоративный и мудрёный. Остаётся Zoom за $15 в месяц, его и взял.
2) Микрофон. Взял конденсаторный Fifine A6V с подключением по USB Type-C. Проверим в деле в пятницу.
3) Для ноутбука взял USB hub, чтобы позволить одновременно зарядку по USB Type-C и микрофон.
4) Видео камера: встроенная в ноутбук. Освещение: как получится в переговорке. Есть желание сделать качественную картинку, но это когда-нибудь в будущем. Сейчас сосредоточусь на содержимом.
5) Сервис для оплаты: крипта, либо по колхозному перевод на банк. карту. Думал, подключить Tribute, но в следующий раз. Оплата опциональна (свободная цена).
6) Код: в GitHub репозитории, будет открыт за несколько часов до начала, чтобы вы могли склонировать и собрать заранее. Сборка: любым удобным вам компилятором, поддерживающим C++17, плюс cmake. IDE: любое удобное вам.
7) Обратная связь. Стандартно соберу через Google Forms после мероприятия.
upd: Fifine микрофон по звуку норм (за свои деньги), но у него плохой usb-c порт, отваливается.
1) Сервис видео конференций. Нужна поддержка конфы до 3ч, из-за чего не подходят бесплатные версии сервисов. Нужна задержка менее 300мс, из-за чего не подходят Youtube Live (в ultra low latency режиме обещают <5 сек, но это всё еще многовато), и Twitch (10-15 sec). Нужна оплата для пользователей РФ, из-за чего отваливается Google Meet. Cisco Webex в целом недоступна для нас. Microsoft Teams чересчур кроваво-корпоративный и мудрёный. Остаётся Zoom за $15 в месяц, его и взял.
2) Микрофон. Взял конденсаторный Fifine A6V с подключением по USB Type-C. Проверим в деле в пятницу.
3) Для ноутбука взял USB hub, чтобы позволить одновременно зарядку по USB Type-C и микрофон.
4) Видео камера: встроенная в ноутбук. Освещение: как получится в переговорке. Есть желание сделать качественную картинку, но это когда-нибудь в будущем. Сейчас сосредоточусь на содержимом.
5) Сервис для оплаты: крипта, либо по колхозному перевод на банк. карту. Думал, подключить Tribute, но в следующий раз. Оплата опциональна (свободная цена).
6) Код: в GitHub репозитории, будет открыт за несколько часов до начала, чтобы вы могли склонировать и собрать заранее. Сборка: любым удобным вам компилятором, поддерживающим C++17, плюс cmake. IDE: любое удобное вам.
7) Обратная связь. Стандартно соберу через Google Forms после мероприятия.
upd: Fifine микрофон по звуку норм (за свои деньги), но у него плохой usb-c порт, отваливается.
👍6❤5
Всем спасибо за участие! Этот тред для участников воркшопа. В комментарии к этому посту скину все ссылки.
🔥9
Что я понял про ведение практических вебинаров (воркшопов)?
Я провёл одну тему (condition variables) три раза с разными людьми, и вот что понял:
— практико-ориентированный подход, в котором участники пишут код прямо сейчас, востребован. Лекций, вебинаров и курсов много, а воркшопов мало.
— 3 часа это слишком, надо уклываться в 2:15 - 2:30, и делать один перерыв на 2-3 минуты (достаточно, чтобы сходить в туалет или налить чаю).
— идея с усложнениями - работает, и некоторые успевают их выполнять.
— Zoom хорошо подходит для такого формата (и, пожалуй, только он и подходит), имеет доступную цену.
— не все задачи и темы подходят для такого формата, т.к. некоторые темы нужно обдумывать и практиковать часами, если не днями. Такое лучше оставлять на offline.
— сначала у меня было 7 задач, потом я сделал 6 задач, сейчас считаю, что достаточно где-то 4-5 задач.
— со своего канала на ~300 человек без какой-либо рекламы у меня получилось привлечь ~20 участников, на конференции было 50 участников и было бы больше, но мы ограничили сверху. Если бы я постарался больше, то смог бы сам привлечь 25-30. С рекламой, полагаю, реально было бы достичь и 60-80, но доказательств пока нет. Учтите, что вход был бесплатным, а с платным входом понадобится реклама и мощная подача.
— до конца у меня доходят примерно 50-60% участников. Надо стремиться увеличивать этот процент.
— я получил 3000 тыр со свободной цены (спасибо, Денис). Добровольная оплата - это хороший признак либо получения реальной пользы, либо эмоций. Однако ради денег делать это не получится, это всё же для каких-то других целей: получить признание, внимание, подписчиков, реализовать себя и т.п.
Дальнейшие планы:
— разработать следующий воркшоп на новую тему на август
— подумать, возможно ли сделать это не в live, чтобы больше людей могли решать задачи в свободное время
Я провёл одну тему (condition variables) три раза с разными людьми, и вот что понял:
— практико-ориентированный подход, в котором участники пишут код прямо сейчас, востребован. Лекций, вебинаров и курсов много, а воркшопов мало.
— 3 часа это слишком, надо уклываться в 2:15 - 2:30, и делать один перерыв на 2-3 минуты (достаточно, чтобы сходить в туалет или налить чаю).
— идея с усложнениями - работает, и некоторые успевают их выполнять.
— Zoom хорошо подходит для такого формата (и, пожалуй, только он и подходит), имеет доступную цену.
— не все задачи и темы подходят для такого формата, т.к. некоторые темы нужно обдумывать и практиковать часами, если не днями. Такое лучше оставлять на offline.
— сначала у меня было 7 задач, потом я сделал 6 задач, сейчас считаю, что достаточно где-то 4-5 задач.
— со своего канала на ~300 человек без какой-либо рекламы у меня получилось привлечь ~20 участников, на конференции было 50 участников и было бы больше, но мы ограничили сверху. Если бы я постарался больше, то смог бы сам привлечь 25-30. С рекламой, полагаю, реально было бы достичь и 60-80, но доказательств пока нет. Учтите, что вход был бесплатным, а с платным входом понадобится реклама и мощная подача.
— до конца у меня доходят примерно 50-60% участников. Надо стремиться увеличивать этот процент.
— я получил 3000 тыр со свободной цены (спасибо, Денис). Добровольная оплата - это хороший признак либо получения реальной пользы, либо эмоций. Однако ради денег делать это не получится, это всё же для каких-то других целей: получить признание, внимание, подписчиков, реализовать себя и т.п.
Дальнейшие планы:
— разработать следующий воркшоп на новую тему на август
— подумать, возможно ли сделать это не в live, чтобы больше людей могли решать задачи в свободное время
🔥16👍2
Воркшоп на какую тему был бы интересен?
Anonymous Poll
31%
Do your own mutex
13%
Sorting, ordering
34%
GDB in practice
21%
Manual compilation/linking
25%
C++20 Ranges
29%
c++20 Concepts
36%
Templates metaprogramming
20%
Do your own container
45%
Binary tools: nm, objdump, ldd, strings, etc
53%
Runtime tools: strace, ltrace, gdb, ss, etc
В пятницу возник интересный вопрос:
Есть ли здесь проблема?
template <typename T>
class Queue {
public:
void push(const T& val) {
std::unique_lock l{_m};
_queue.push(val);
if (_queue.size() == 1) { // was empty
_not_empty_cv.notify_one();
}
}
T pop() {
std::unique_lock l{_m};
_not_empty_cv.wait(l, [&]() {
return !_queue.empty();
});
auto v = std::move(_queue.front());
_queue.pop();
return v;
}
private:
std::mutex _m;
std::condition_variable _not_empty_cv;
std::queue<T> _queue;
};
Есть ли здесь проблема?
🤔3🔥2
В комментах к предыдущему вопросу были верные ответы. Продолжаем ковырять condition variables, есть ли здесь проблема?
template <typename T>
class Queue {
public:
Queue(size_t limit): _limit(limit) {}
void push(const T& val) {
std::unique_lock l{_m};
_cv.wait(l, [&] { return !_limit || _queue.size() < _limit; });
_queue.push(val);
_cv.notify_one(); // there's at least one item!
}
T pop() {
std::unique_lock l{_m};
_cv.wait(l, [&] { return !_queue.empty(); });
auto v = std::move(_queue.front());
_queue.pop();
_cv.notify_one(); // there's at least one slot!
return v;
}
private:
std::mutex _m;
std::condition_variable _cv;
std::queue<T> _queue;
size_t _limit;
};
Третьим будет вопрос: как лучше и как корректно: делать unlock после notify или до (и почему)?
или
{
std::unique_lock l{_m};
_queue.push(val);
_cv.notify_one();
}
или
{
std::unique_lock l{_m};
_queue.push(val);
}
_cv.notify_one();
👍2