Собираем потокобезопасную очередь на C++!
Нужно передавать задачи между потоками так, чтобы один поток мог добавлять элементы, а другой спокойно ждать новые данные без активного цикла и лишней нагрузки на CPU.
В этой задаче:
Такую основу можно использовать для worker-пула, фоновой обработки логов, очереди событий или простого producer-consumer сценария.
📣 C++ Ready | #задачу
Нужно передавать задачи между потоками так, чтобы один поток мог добавлять элементы, а другой спокойно ждать новые данные без активного цикла и лишней нагрузки на CPU.
В этой задаче:
• храним queue под mutex
• будим ожидающий поток через condition_variable
• достаём элементы через wait_and_pop
Такую основу можно использовать для worker-пула, фоновой обработки логов, очереди событий или простого producer-consumer сценария.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍8🔥4
Напоминалка по lambda expressions в C++!
Например, capture by reference позволяет лямбде работать с внешней переменной напрямую, capture by value сохраняет копию значения, а mutable даёт менять захваченную копию внутри лямбды.
На картинке собраны основные приёмы работы с lambda expressions. Есть захваты по ссылке и по значению, init capture, immediately invoked lambdas, mutable lambdas, generic lambdas, perfect forwarding и возможности C++20.
Сохрани, чтобы не потерять!
📣 C++ Ready | #ресурс
Например, capture by reference позволяет лямбде работать с внешней переменной напрямую, capture by value сохраняет копию значения, а mutable даёт менять захваченную копию внутри лямбды.
На картинке собраны основные приёмы работы с lambda expressions. Есть захваты по ссылке и по значению, init capture, immediately invoked lambdas, mutable lambdas, generic lambdas, perfect forwarding и возможности C++20.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍6🔥3
Разбираем std::variant: как хранить разные типы без unsafe union!
std::variant помогает описывать значения, которые могут быть одним из нескольких заранее известных типов. Это удобно для парсеров, состояний, команд, ошибок и ответов API: данные остаются типобезопасными, а компилятор помогает не забыть обработать нужные варианты.
📣 C++ Ready | #шпора
std::variant помогает описывать значения, которые могут быть одним из нескольких заранее известных типов. Это удобно для парсеров, состояний, команд, ошибок и ответов API: данные остаются типобезопасными, а компилятор помогает не забыть обработать нужные варианты.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤5👍3
Зачем в C++ помечать важные результаты через [[nodiscard]]?
Иногда функция возвращает значение, которое нельзя просто проигнорировать: статус операции, ошибку, открытый ресурс, результат валидации.
Например:
Код компилируется, но результат потерян. Если сохранение не удалось, программа может продолжить работу так, будто всё нормально.
Для таких случаев есть атрибут [[nodiscard]]:
Теперь компилятор предупредит, если результат вызова проигнорировали:
Правильнее явно обработать результат:
Особенно полезно помечать функции, которые возвращают объект ошибки:
Или результат проверки:
Если результат действительно нужно проигнорировать, лучше показать это явно:
Так сразу видно, что разработчик сделал это осознанно, а не случайно.
📣 C++ Ready | #совет
Иногда функция возвращает значение, которое нельзя просто проигнорировать: статус операции, ошибку, открытый ресурс, результат валидации.
Например:
bool save_config() {
return write_file("config.json");
}
save_config();Код компилируется, но результат потерян. Если сохранение не удалось, программа может продолжить работу так, будто всё нормально.
Для таких случаев есть атрибут [[nodiscard]]:
[[nodiscard]]
bool save_config() {
return write_file("config.json");
}
Теперь компилятор предупредит, если результат вызова проигнорировали:
save_config(); // warning
Правильнее явно обработать результат:
if (!save_config()) {
std::cerr << "Config was not saved\n";
}Особенно полезно помечать функции, которые возвращают объект ошибки:
[[nodiscard]]
std::optional<User> find_user(int id);
Или результат проверки:
[[nodiscard]]
bool is_valid_token(std::string_view token);
Если результат действительно нужно проигнорировать, лучше показать это явно:
(void)save_config();
Так сразу видно, что разработчик сделал это осознанно, а не случайно.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍7🔥3
Интересная статья про компилятор на C++ и LLVM!
Автор рассказывает, как писал собственный язык Marble и постепенно собирал вокруг него lexer, parser, AST, генерацию LLVM IR и диагностику ошибок.
В статье автор показывает:
• как разбить компилятор на понятные этапы
• зачем нужен AST перед генерацией LLVM IR
• как обрабатывать ошибки так, чтобы язык было реально удобно развивать
📣 C++ Ready | #статья
Автор рассказывает, как писал собственный язык Marble и постепенно собирал вокруг него lexer, parser, AST, генерацию LLVM IR и диагностику ошибок.
В статье автор показывает:
• как разбить компилятор на понятные этапы
• зачем нужен AST перед генерацией LLVM IR
• как обрабатывать ошибки так, чтобы язык было реально удобно развивать
Продолжай читать на Habr
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3🔥3😁1
Уже очевидно, что ВАЙБКОДИНГ — главный навык ближайших лет
Посмотрите сами. ИИ уже забирает на себя работу целых команд: пишет код, закрывает задачи джунов и позволяет стартапам запускать продукты в 2–3 раза меньшим составом. То, на что раньше нужны были несколько разработчиков, сегодня всё чаще делает один человек с ИИ-агентами.
И это только начало. Те, кто освоит вайбкодинг сейчас, смогут быстрее запускать проекты, автоматизировать огромный объём работы, увереннее конкурировать на рынке и зарабатывать больше тех, кто продолжает делать всё вручную.
Начать с нуля поможет канал Вайб-кодинг. Там ребята круглосуточно мониторят более 320 российских и зарубежных источников и публикуют только главное: релизы, инструменты, гайды, курсы и практические кейсы.
Подписывайтесь, нас уже 60 тысяч: @vibecoding_tg
Посмотрите сами. ИИ уже забирает на себя работу целых команд: пишет код, закрывает задачи джунов и позволяет стартапам запускать продукты в 2–3 раза меньшим составом. То, на что раньше нужны были несколько разработчиков, сегодня всё чаще делает один человек с ИИ-агентами.
И это только начало. Те, кто освоит вайбкодинг сейчас, смогут быстрее запускать проекты, автоматизировать огромный объём работы, увереннее конкурировать на рынке и зарабатывать больше тех, кто продолжает делать всё вручную.
Начать с нуля поможет канал Вайб-кодинг. Там ребята круглосуточно мониторят более 320 российских и зарубежных источников и публикуют только главное: релизы, инструменты, гайды, курсы и практические кейсы.
Подписывайтесь, нас уже 60 тысяч: @vibecoding_tg
👎10😁10
Почему structured binding может неожиданно копировать данные?
В C++ structured binding удобно распаковывает пары, tuple и элементы map:
Но здесь
Если изменить
Для маленьких чисел это неважно, но для строк, векторов и больших объектов можно получить лишние копирования.
Если нужно работать с исходными значениями, используй ссылку:
Теперь меняется сам объект:
То же самое часто встречается при обходе map:
Такой код меняет копию value, а не элемент внутри map.
Правильно, если нужно менять данные:
А если нужно только читать без копий:
Structured binding удобная штука. Для реальных данных чаще нужны
📣 C++ Ready | #совет
В C++ structured binding удобно распаковывает пары, tuple и элементы map:
auto item = std::pair{1, std::string("ready")};
auto [id, name] = item;Но здесь
id и name это копии значений из item.Если изменить
name, исходная пара не изменится:name = "cpp";
std::cout << item.second; // ready
Для маленьких чисел это неважно, но для строк, векторов и больших объектов можно получить лишние копирования.
Если нужно работать с исходными значениями, используй ссылку:
auto& [id, name] = item;
name = "cpp";
Теперь меняется сам объект:
std::cout << item.second; // cpp
То же самое часто встречается при обходе map:
for (auto [key, value] : users) {
value.active = false;
}Такой код меняет копию value, а не элемент внутри map.
Правильно, если нужно менять данные:
for (auto& [key, value] : users) {
value.active = false;
}А если нужно только читать без копий:
for (const auto& [key, value] : users) {
std::cout << key << value.name;
}Structured binding удобная штука. Для реальных данных чаще нужны
auto& или const auto&.Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍4🔥4
Шпаргалка по std::move в алгоритмах C++!
Например, std::move из <algorithm> переносит элементы из одного диапазона в другой. Это не то же самое, что std::move из <utility>, который просто превращает объект в rvalue.
На картинке показано, как работает алгоритм move. Есть исходный диапазон, целевой диапазон, возвращаемый итератор и вариант ranges::move из C++20.
Сохрани, чтобы не потерять!
📣 C++ Ready | #ресурс
Например, std::move из <algorithm> переносит элементы из одного диапазона в другой. Это не то же самое, что std::move из <utility>, который просто превращает объект в rvalue.
На картинке показано, как работает алгоритм move. Есть исходный диапазон, целевой диапазон, возвращаемый итератор и вариант ranges::move из C++20.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍4🔥3
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
ВАЙБКОДИНГ: t.me/data_analysis_ml
DevOps: t.me/DevOPSitsec
Docker: https://t.me/+90Z5TAyfuNU5YmRi
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_1001_notes
Java: t.me/javatg
JavaScript: t.me/javascriptv
React: t.me/react_tg
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Big Data: t.me/bigdatai
Математика: t.me/data_math
Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка Frontend: https://t.me/addlist/mzMMG3RPZhY2M2Iy
ИТ-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
ВАЙБКОДИНГ: t.me/data_analysis_ml
DevOps: t.me/DevOPSitsec
Docker: https://t.me/+90Z5TAyfuNU5YmRi
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_1001_notes
Java: t.me/javatg
JavaScript: t.me/javascriptv
React: t.me/react_tg
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Big Data: t.me/bigdatai
Математика: t.me/data_math
Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка Frontend: https://t.me/addlist/mzMMG3RPZhY2M2Iy
ИТ-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
❤3😁1
Фильтруем файлы по расширению через std::filesystem!
Иногда нужно быстро пройтись по папке и выбрать только нужные файлы. Например, найти все .log, .json, .txt или .cpp файлы для дальнейшей обработки.
Для этого удобно использовать std::filesystem. Он даёт нормальные типы для путей, директорий и файлов без ручной склейки строк.
Сначала зададим директорию и нужное расширение:
Теперь можно пройти по директории рекурсивно:
Важно не обрабатывать директории как файлы. Поэтому сначала проверяем тип элемента:
После этого сравниваем расширение через path::extension:
Такой код не зависит от ручного поиска точки в имени файла. Если путь содержит несколько точек или вложенные папки, filesystem всё равно корректно выделит расширение.
Можно легко заменить действие внутри if. Вместо вывода в консоль файл можно прочитать, добавить в список, посчитать размер или передать в другую функцию.
📣 C++ Ready | #практика
Иногда нужно быстро пройтись по папке и выбрать только нужные файлы. Например, найти все .log, .json, .txt или .cpp файлы для дальнейшей обработки.
Для этого удобно использовать std::filesystem. Он даёт нормальные типы для путей, директорий и файлов без ручной склейки строк.
Сначала зададим директорию и нужное расширение:
namespace fs = std::filesystem;
fs::path root = "logs";
std::string ext = ".log";
Теперь можно пройти по директории рекурсивно:
for (const auto& entry : fs::recursive_directory_iterator(root)) {
// проверяем каждый элемент
}Важно не обрабатывать директории как файлы. Поэтому сначала проверяем тип элемента:
if (!entry.is_regular_file()) {
continue;
}После этого сравниваем расширение через path::extension:
if (entry.path().extension() == ext) {
std::cout << entry.path() << "\n";
}Такой код не зависит от ручного поиска точки в имени файла. Если путь содержит несколько точек или вложенные папки, filesystem всё равно корректно выделит расширение.
Можно легко заменить действие внутри if. Вместо вывода в консоль файл можно прочитать, добавить в список, посчитать размер или передать в другую функцию.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍4🔥3