namespace alias
В C++, вы можете использовать «namespace alias» (псевдоним пространства имен) для упрощения работы с длинными именами пространств имен. Это позволяет вам создать более короткий псевдоним для длинного имени пространства имен, что улучшает читаемость кода и уменьшает вероятность конфликтов имен.
Для создания псевдонима пространства имен используйте ключевое слово namespace с алиасом (псевдонимом).
#код
В C++, вы можете использовать «namespace alias» (псевдоним пространства имен) для упрощения работы с длинными именами пространств имен. Это позволяет вам создать более короткий псевдоним для длинного имени пространства имен, что улучшает читаемость кода и уменьшает вероятность конфликтов имен.
Для создания псевдонима пространства имен используйте ключевое слово namespace с алиасом (псевдонимом).
#код
Подборка лучших статей «Библиотеки программиста» за сентябрь: сохраняй в заметки, чтобы не пропустить #самыйсок
📕 ТОП-9 книг по языку программирования Go в 2023 году: от новичка до профессионала
🐍 Дорожная карта Python-разработчика в 2023 году
🎓💼 ТОП-9 не самых очевидных компаний для стажировки в ИТ
☕🛣️ Дорожная карта Java-разработчика в 2023 году
🦸⚡ 9 способов настройки градиента цели для поддержания мотивации
⚒️ ТОП-27 плагинов для Visual Studio Code в 2023
🔎💼🗺️ Как программисту искать (и найти) работу за границей в 2023 году
🔝 Приоритизация задач по методу MoSCoW: как за 5 минут научиться грамотно расставлять приоритеты
🤖 Создание собственного ИИ-бота на Python за 33 строчки кода
📊 Как я входил в IT? Результаты опроса «Библиотеки программиста»
📕 ТОП-9 книг по языку программирования Go в 2023 году: от новичка до профессионала
🐍 Дорожная карта Python-разработчика в 2023 году
🎓💼 ТОП-9 не самых очевидных компаний для стажировки в ИТ
☕🛣️ Дорожная карта Java-разработчика в 2023 году
🦸⚡ 9 способов настройки градиента цели для поддержания мотивации
⚒️ ТОП-27 плагинов для Visual Studio Code в 2023
🔎💼🗺️ Как программисту искать (и найти) работу за границей в 2023 году
🔝 Приоритизация задач по методу MoSCoW: как за 5 минут научиться грамотно расставлять приоритеты
🤖 Создание собственного ИИ-бота на Python за 33 строчки кода
📊 Как я входил в IT? Результаты опроса «Библиотеки программиста»
Placement new
Placement new — это специальный оператор, который позволяет создавать объекты в заданной области памяти, вместо выделения новой памяти для объекта. Это полезно, когда вы хотите явно контролировать расположение объектов в памяти, например, при работе с устройствами ввода-вывода или при реализации собственных аллокаторов.
Обратите внимание, что после использования объекта, созданного с помощью placement new, вы должны вызвать его деструктор явно, как показано в примере выше. Это необходимо для правильного освобождения ресурсов и избежания утечек памяти.
#код
Placement new — это специальный оператор, который позволяет создавать объекты в заданной области памяти, вместо выделения новой памяти для объекта. Это полезно, когда вы хотите явно контролировать расположение объектов в памяти, например, при работе с устройствами ввода-вывода или при реализации собственных аллокаторов.
Обратите внимание, что после использования объекта, созданного с помощью placement new, вы должны вызвать его деструктор явно, как показано в примере выше. Это необходимо для правильного освобождения ресурсов и избежания утечек памяти.
#код
Механизм маршрутизации с открытым исходным кодом для OpenStreetMap
Valhalla также включает в себя такие инструменты, как вычисление матрицы времени и расстояния, изохроны, выборку высот, сопоставление карт и оптимизацию туров.
Открыть репозиторий
Valhalla также включает в себя такие инструменты, как вычисление матрицы времени и расстояния, изохроны, выборку высот, сопоставление карт и оптимизацию туров.
Открыть репозиторий
Функции вместимости в строках
1. capacity() — функция возвращает ёмкость памяти, выделенную для строки, которая может быть равной или больше, чем размер самой строки. Дополнительное пространство выделяется таким образом, чтобы при добавлении новых символов в строку операции могли выполняться эффективно.
2. resize() — функция изменяет размер строки, его можно увеличивать или уменьшать.
3. length() — функция возвращает длину строки.
4. shrink_to_fit() — функция уменьшает ёмкость памяти строки, делает ее равной минимально возможной. Эта операция полезна для экономии дополнительной памяти, когда мы уверены, что больше не нужно добавлять символы.
1. capacity() — функция возвращает ёмкость памяти, выделенную для строки, которая может быть равной или больше, чем размер самой строки. Дополнительное пространство выделяется таким образом, чтобы при добавлении новых символов в строку операции могли выполняться эффективно.
2. resize() — функция изменяет размер строки, его можно увеличивать или уменьшать.
3. length() — функция возвращает длину строки.
4. shrink_to_fit() — функция уменьшает ёмкость памяти строки, делает ее равной минимально возможной. Эта операция полезна для экономии дополнительной памяти, когда мы уверены, что больше не нужно добавлять символы.
Что такое CI/CD и какие преимущества дает разработчику?
CI/CD означает непрерывную интеграцию и непрерывное развертывание. Это набор практик и инструментов, используемых в разработке программного обеспечения для автоматизации процесса создания, тестирования и развертывания приложений.
Непрерывная интеграция включает в себя интеграцию изменений кода от нескольких разработчиков в общий репозиторий часто, как правило, несколько раз в день. Каждая интеграция запускает автоматизированный процесс сборки и тестирования для раннего обнаружения и решения проблем интеграции.
Непрерывное развертывание (или Continuous Delivery) направлено на автоматизацию процесса развертывания программного обеспечения в производственных средах. Он включает в себя автоматизацию шагов, необходимых для упаковки, развертывания и настройки приложения.
Вот некоторые преимущества CI/CD для разработчиков C++:
1. Раннее обнаружение ошибок.
2. Более быстрый цикл обратной связи.
3. Качество и ремонтопригодность кода.
4. Сотрудничество и коммуникация между разработчиками.
5. Автоматизация сборки, тестирования и развертывания кода.
6. Непрерывное развертывание.
7. Масштабируемость.
#вопросы_с_собеседований
CI/CD означает непрерывную интеграцию и непрерывное развертывание. Это набор практик и инструментов, используемых в разработке программного обеспечения для автоматизации процесса создания, тестирования и развертывания приложений.
Непрерывная интеграция включает в себя интеграцию изменений кода от нескольких разработчиков в общий репозиторий часто, как правило, несколько раз в день. Каждая интеграция запускает автоматизированный процесс сборки и тестирования для раннего обнаружения и решения проблем интеграции.
Непрерывное развертывание (или Continuous Delivery) направлено на автоматизацию процесса развертывания программного обеспечения в производственных средах. Он включает в себя автоматизацию шагов, необходимых для упаковки, развертывания и настройки приложения.
Вот некоторые преимущества CI/CD для разработчиков C++:
1. Раннее обнаружение ошибок.
2. Более быстрый цикл обратной связи.
3. Качество и ремонтопригодность кода.
4. Сотрудничество и коммуникация между разработчиками.
5. Автоматизация сборки, тестирования и развертывания кода.
6. Непрерывное развертывание.
7. Масштабируемость.
#вопросы_с_собеседований
Декларация
Декларация — это объявление имени сущности (переменной, функции, класса и т. д.) без определения ее типа или реализации. Декларации используются для предварительного объявления сущности в программе, чтобы компилятор знал о ее существовании, но не обязан знать ее полную информацию или реализацию на этом этапе. Это полезно, когда вы хотите использовать сущность в разных частях вашей программы.
Обратите внимание, что декларации часто используются в заголовочных файлах (.h или .hpp), чтобы предоставить интерфейс к функциям или классам, а затем реализация определяется в соответствующих исходных файлах (.cpp). Это помогает разделить интерфейс и реализацию и упростить структуру проекта.
#код
Декларация — это объявление имени сущности (переменной, функции, класса и т. д.) без определения ее типа или реализации. Декларации используются для предварительного объявления сущности в программе, чтобы компилятор знал о ее существовании, но не обязан знать ее полную информацию или реализацию на этом этапе. Это полезно, когда вы хотите использовать сущность в разных частях вашей программы.
Обратите внимание, что декларации часто используются в заголовочных файлах (.h или .hpp), чтобы предоставить интерфейс к функциям или классам, а затем реализация определяется в соответствующих исходных файлах (.cpp). Это помогает разделить интерфейс и реализацию и упростить структуру проекта.
#код
Вглубь std::unordered_map: магические числа
Эта статья о том, каким странным бывает легаси — и куда же всё-таки копать, чтобы понять, что происходит. stdlibc++ опровергает даже стандартные математические понятия. Как хорошо, что это хотя бы опенсорс....
Читать статью
Эта статья о том, каким странным бывает легаси — и куда же всё-таки копать, чтобы понять, что происходит. stdlibc++ опровергает даже стандартные математические понятия. Как хорошо, что это хотя бы опенсорс....
Читать статью
Самые полезные каналы для программистов в одной подборке!
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
🐘PHP
Библиотека пхпшника
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты
🐍Python
Библиотека питониста
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты
☕Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков
👾Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту
🦫Go
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go
🧠C++
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++
💻Другие профильные каналы
Библиотека фронтендера
Библиотека шарписта
Библиотека мобильного разработчика
Библиотека хакера
Библиотека devops’a
Библиотека тестировщика
💼Каналы с вакансиями
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel
Вакансии по DevOps & SRE
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
🤖Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook
🔸Instagram
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
🐘PHP
Библиотека пхпшника
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты
🐍Python
Библиотека питониста
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты
☕Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков
👾Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту
🦫Go
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go
🧠C++
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++
💻Другие профильные каналы
Библиотека фронтендера
Библиотека шарписта
Библиотека мобильного разработчика
Библиотека хакера
Библиотека devops’a
Библиотека тестировщика
💼Каналы с вакансиями
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel
Вакансии по DevOps & SRE
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
🤖Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
co_await, co_yield и co_return
co_await, co_yield и co_return — это ключевые слова, которые используются для реализации корутин (coroutines).
co_await используется для приостановки корутины и ожидания результата асинхронной операции.
co_yield используется для приостановки корутины и передачи управления обратно вызывающему коду.
co_return используется для завершения корутины и возврата результата.
В этом примере используются все три ключевых слова:
— co_await приостанавливает корутину create_task в начале.
— co_yield можно было бы использовать для дополнительных приостановок.
— co_return завершает корутину в конце.
#код
co_await, co_yield и co_return — это ключевые слова, которые используются для реализации корутин (coroutines).
co_await используется для приостановки корутины и ожидания результата асинхронной операции.
co_yield используется для приостановки корутины и передачи управления обратно вызывающему коду.
co_return используется для завершения корутины и возврата результата.
В этом примере используются все три ключевых слова:
— co_await приостанавливает корутину create_task в начале.
— co_yield можно было бы использовать для дополнительных приостановок.
— co_return завершает корутину в конце.
#код
Очередной #дайджест по С++:
🤖 IMSProg — программатор для CH341a в Linux
О создании полезных программ под линукс.
🤖 Поиск ошибок в проектах на основе Unreal Engine
В статическом анализаторе PVS-Studio начали появляться диагностические правила для выявления багов, специфичных для Unreal Engine проектов.
🤖 Как я делал бюджетное устройство мониторинга качества среды и что из этого вышло
Про довольно необычную автоматизацию.
🤖 Современное состояние инструментов поиска утечек памяти
Несмотря на большое количество доступных инструментов поиска утечек памяти, существует ряд ограничений применимости этих инструментов.
🤖 IMSProg — программатор для CH341a в Linux
О создании полезных программ под линукс.
🤖 Поиск ошибок в проектах на основе Unreal Engine
В статическом анализаторе PVS-Studio начали появляться диагностические правила для выявления багов, специфичных для Unreal Engine проектов.
🤖 Как я делал бюджетное устройство мониторинга качества среды и что из этого вышло
Про довольно необычную автоматизацию.
🤖 Современное состояние инструментов поиска утечек памяти
Несмотря на большое количество доступных инструментов поиска утечек памяти, существует ряд ограничений применимости этих инструментов.
Как часто вы обращаетесь к документации?
#интерактив
#интерактив
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
В чем разница между многопоточностью и асинхронностью?
Разница между многопоточностью и асинхронностью заключается в подходе к параллельному выполнению кода.
При многопоточности создаются несколько потоков управления, которые выполняются параллельно и могут разделять общие данные.
Это позволяет эффективно использовать многоядерные процессоры, но требует синхронизации доступа к общим данным с помощью мьютексов, семафоров и т. д.
Асинхронность же основана на событийной модели — код выполняется последовательно в рамках одного потока, но части кода могут приостанавливаться в ожидании каких-либо событий (например, завершения ввода-вывода).
Это позволяет избежать сложностей синхронизации, но ограничивает возможности параллелизма.
Таким образом, многопоточность эффективнее использует ресурсы процессора, а асинхронность проще в реализации и избегает проблем синхронизации.
#вопросы_с_собеседований
Разница между многопоточностью и асинхронностью заключается в подходе к параллельному выполнению кода.
При многопоточности создаются несколько потоков управления, которые выполняются параллельно и могут разделять общие данные.
Это позволяет эффективно использовать многоядерные процессоры, но требует синхронизации доступа к общим данным с помощью мьютексов, семафоров и т. д.
Асинхронность же основана на событийной модели — код выполняется последовательно в рамках одного потока, но части кода могут приостанавливаться в ожидании каких-либо событий (например, завершения ввода-вывода).
Это позволяет избежать сложностей синхронизации, но ограничивает возможности параллелизма.
Таким образом, многопоточность эффективнее использует ресурсы процессора, а асинхронность проще в реализации и избегает проблем синхронизации.
#вопросы_с_собеседований
Aggregate initialization
Aggregate initialization — это форма инициализации, которая позволяет инициализировать агрегаты (объекты определенных типов) с использованием фигурных скобок и списка значений. Агрегаты могут быть одним из следующих типов:
— Массивы
— Структуры или классы без пользовательских конструкторов, без закрытых или защищенных нестатических членов данных, без базовых классов и без виртуальных функций.
В этом примере мы создаем структуру Point, которая содержит два целочисленных поля x и y. Затем мы инициализируем объект p1 этой структуры с помощью aggregate initialization, указывая значения для x и y в фигурных скобках. Аналогично, мы инициализируем массив arr с помощью списка значений в фигурных скобках.
#код
Aggregate initialization — это форма инициализации, которая позволяет инициализировать агрегаты (объекты определенных типов) с использованием фигурных скобок и списка значений. Агрегаты могут быть одним из следующих типов:
— Массивы
— Структуры или классы без пользовательских конструкторов, без закрытых или защищенных нестатических членов данных, без базовых классов и без виртуальных функций.
В этом примере мы создаем структуру Point, которая содержит два целочисленных поля x и y. Затем мы инициализируем объект p1 этой структуры с помощью aggregate initialization, указывая значения для x и y в фигурных скобках. Аналогично, мы инициализируем массив arr с помощью списка значений в фигурных скобках.
#код
Пробовали ли программировать на планшете?
#интерактив
#интерактив
Автоматический вывод типа аргумента шаблона класса
Выглядит название этой возможности довольно длинным и сложным, но на самом деле ничего сложного тут нет. Основная идея в том, что в C++17 вывод типов аргументов шаблонов выполняется и для стандартных шаблонов классов. Ранее это поддерживалось лишь для функциональных шаблонов. В результате оказывается, что раньше писали так:
std::pair user = {"M", 25};
С выходом C++ 17 эту конструкцию стало можно заменить на эту:
std::pair user = {"M", 25};
Вывод типов выполняется неявно. Этим механизмом ещё удобнее пользоваться в том случае, когда речь идёт о кортежах. А именно, раньше приходилось писать следующее:
std::tuple user ("M", "Chy", 25);
Теперь же то же самое выглядит так:
std::tuple user2("M", "Chy", 25);
Тут стоит отметить, что эти возможности не покажутся чем-то достойным внимания тем, кто не особенно хорошо знаком с шаблонами C++.
Выглядит название этой возможности довольно длинным и сложным, но на самом деле ничего сложного тут нет. Основная идея в том, что в C++17 вывод типов аргументов шаблонов выполняется и для стандартных шаблонов классов. Ранее это поддерживалось лишь для функциональных шаблонов. В результате оказывается, что раньше писали так:
std::pair user = {"M", 25};
С выходом C++ 17 эту конструкцию стало можно заменить на эту:
std::pair user = {"M", 25};
Вывод типов выполняется неявно. Этим механизмом ещё удобнее пользоваться в том случае, когда речь идёт о кортежах. А именно, раньше приходилось писать следующее:
std::tuple user ("M", "Chy", 25);
Теперь же то же самое выглядит так:
std::tuple user2("M", "Chy", 25);
Тут стоит отметить, что эти возможности не покажутся чем-то достойным внимания тем, кто не особенно хорошо знаком с шаблонами C++.
Очередной #дайджест по С++:
✍️ Глубина кроличьей норы: бинарная граница и ABI C++
Мир С++ многое сокрывает от глаз программиста. Это свойство языка — обоюдоострый меч, который с одной стороны позволяет уменьшить порог входа, но в то же время является препятствием при написании программ, уходящих дальше стандартного примера.
✍️ C++ и космические технологии
О новшестве в мире C++ — операторе "спейсшип" (spaceship aka three-way comparison), он же тройное сравнение.
✍️ Сборка мусора: как это делается в системном программировании
Поговорим об одной из наиболее критичных по производительности программ, которой вы пользуетесь ежедневно: о вашей операционной системе.
✍️ Действительно ли указатели функций и виртуальные функции работают медленно?
Довольно большая статья об оптимизации.
✍️ Глубина кроличьей норы: бинарная граница и ABI C++
Мир С++ многое сокрывает от глаз программиста. Это свойство языка — обоюдоострый меч, который с одной стороны позволяет уменьшить порог входа, но в то же время является препятствием при написании программ, уходящих дальше стандартного примера.
✍️ C++ и космические технологии
О новшестве в мире C++ — операторе "спейсшип" (spaceship aka three-way comparison), он же тройное сравнение.
✍️ Сборка мусора: как это делается в системном программировании
Поговорим об одной из наиболее критичных по производительности программ, которой вы пользуетесь ежедневно: о вашей операционной системе.
✍️ Действительно ли указатели функций и виртуальные функции работают медленно?
Довольно большая статья об оптимизации.
std::conditional_variable
Стандартная библиотека предоставляет два компонента для работы с многопоточностью: std::thread для создания и управления потоками и std::mutex для обеспечения синхронизации доступа к общим данным. Для синхронизации потоков при ожидании определенных условий используется std::condition_variable.
std::condition_variable представляет собой механизм, который позволяет одному потоку ждать, пока другой поток выполняет определенные действия, и затем оповещать первый поток о завершении выполнения этих действий. Она используется вместе с std::unique_lock (или другими мьютексами) для ожидания изменения состояния.
#код
Стандартная библиотека предоставляет два компонента для работы с многопоточностью: std::thread для создания и управления потоками и std::mutex для обеспечения синхронизации доступа к общим данным. Для синхронизации потоков при ожидании определенных условий используется std::condition_variable.
std::condition_variable представляет собой механизм, который позволяет одному потоку ждать, пока другой поток выполняет определенные действия, и затем оповещать первый поток о завершении выполнения этих действий. Она используется вместе с std::unique_lock (или другими мьютексами) для ожидания изменения состояния.
#код