💭 Race conditions в атомарных операциях - одна из самых коварных проблем. Разбираемся с memory ordering.
Проблема: Неопределенное поведение при concurrent доступе
// ❌ ОПАСНО: data race!
std::atomic<bool> ready{false};
int data = 0;
// Thread 1
data = 42;
ready.store(true); // неопределенный ordering!
// Thread 2
if (ready.load()) {
process(data); // может быть 0 или 42!
}
Решение: Explicit memory ordering
// ✅ ПРАВИЛЬНО: используем memory_order
std::atomic<bool> ready{false};
int data = 0;
// Thread 1
data = 42;
ready.store(true, std::memory_order_release); // освобождаем
// Thread 2
if (ready.load(std::memory_order_acquire)) { // захватываем
process(data); // гарантированно 42!
}
⚠️ Частые ошибки:
• Использование memory_order_relaxed везде
• Забывание про acquire-release семантику
• Смешивание атомарных и неатомарных операций
Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5👍2
👾 Clang получает режим усиленной безопасности
Разработчики
🏖️ Новый режим одной командой активирует целый набор защитных механизмов:
• Инициализация переменных нулями
• Защита стека и от переполнений
• Рандомизация адресов
• Усиленные проверки библиотек
• Дополнительные предупреждения
Проблема: разрозненность опций безопасности в C/C++. Многие разработчики просто не знают о их существовании или забывают включать.
Решение: единый флаг, который «из коробки» делает код безопаснее.
Конечно, это костыли для языков 70-80х годов, но лучше поздно чем никогда.
👉 Заметка
Библиотека C/C++ разработчика #буст
Разработчики
Clang
обсуждают добавление флага -fhardened
по аналогии с GCC 14
. 🏖️ Новый режим одной командой активирует целый набор защитных механизмов:
• Инициализация переменных нулями
• Защита стека и от переполнений
• Рандомизация адресов
• Усиленные проверки библиотек
• Дополнительные предупреждения
Проблема: разрозненность опций безопасности в C/C++. Многие разработчики просто не знают о их существовании или забывают включать.
Решение: единый флаг, который «из коробки» делает код безопаснее.
Конечно, это костыли для языков 70-80х годов, но лучше поздно чем никогда.
👉 Заметка
Библиотека C/C++ разработчика #буст
Часто при написании операторов присваивания или swap-функций приходится сохранять старое значение, заменяя его новым. Код получается многословным и подверженным ошибкам.
std::exchange
атомарно заменяет значение переменной и возвращает старое значение — всё в одной строке.T old_value = obj;
obj = new_value;
return old_value;
return std::exchange(obj, new_value);
Код становится более читаемым, безопасным и выразительным. Особенно полезно в RAII-классах и при работе с умными указателями.
Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤1
Forwarded from Proglib.academy | IT-курсы
🌐 Чек-лист: как искать работу
Чтобы не застрять в вечной отладке своей карьеры, держим в голове (и перед глазами) понятный план. Вот чек-лист на период поиска:
✅ Обновите резюме и профиль (да, и GitHub тоже)
Ваш профиль — это витрина. Убедитесь, что в нём отражены:
• актуальные технологии (например, .NET 6/7/8, Blazor, ASP.NET, Azure и т. д.).
• понятные результаты («реализовал систему логирования» , а не «писал код»).
• ссылки на GitHub с чистыми, осмысленными проектами — лишнее желательно скрыть или удалить.
✅ Сформулируйте ключевые навыки и корректные поисковые запросы.
Большинство рекрутеров используют автоматические фильтры. Включите в резюме чёткие названия технологий: Entity Framework Core, LINQ, RabbitMQ, Docker, CI/CD, Kubernetes.
✅ Следите за вакансиями регулярно, но без стресса
• Настройте уведомления на LinkedIn, Habr Career, hh.
• Подпишитесь на каналы с вакансиями, например, наш канал с вакансиями для шарпистов.
✅ Готовьтесь к собеседованиям заранее
• Освежите базовые концепции вроде async/await, Dependency Injection, SOLID, разберитесь в нюансах работы ASP.NET.
• Подумайте заранее, какие проекты вы можете описать как удачные кейсы.
• Поработайте над формулировками, которые показывают ваш вклад — рекрутеры ценят конкретику.
Сколько ищете работу? Пару дней или пару месяцев? Пишите в комментарии👇
Proglib Academy #буст
Чтобы не застрять в вечной отладке своей карьеры, держим в голове (и перед глазами) понятный план. Вот чек-лист на период поиска:
Ваш профиль — это витрина. Убедитесь, что в нём отражены:
• актуальные технологии (например, .NET 6/7/8, Blazor, ASP.NET, Azure и т. д.).
• понятные результаты («реализовал систему логирования» , а не «писал код»).
• ссылки на GitHub с чистыми, осмысленными проектами — лишнее желательно скрыть или удалить.
Большинство рекрутеров используют автоматические фильтры. Включите в резюме чёткие названия технологий: Entity Framework Core, LINQ, RabbitMQ, Docker, CI/CD, Kubernetes.
• Настройте уведомления на LinkedIn, Habr Career, hh.
• Подпишитесь на каналы с вакансиями, например, наш канал с вакансиями для шарпистов.
• Освежите базовые концепции вроде async/await, Dependency Injection, SOLID, разберитесь в нюансах работы ASP.NET.
• Подумайте заранее, какие проекты вы можете описать как удачные кейсы.
• Поработайте над формулировками, которые показывают ваш вклад — рекрутеры ценят конкретику.
Сколько ищете работу? Пару дней или пару месяцев? Пишите в комментарии👇
Proglib Academy #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🧨 Range views: детали реализации, неочевидное поведение и влияние на производительность
Современные диапазоны могут заменить 90% ваших циклов — но есть подводные камни.
Разработчик из Яндекса разобрал детали реализации
• Композируемость алгоритмов — строите цепочки операций через
• Ленивые вычисления — всё выполняется за один проход, экономя память и время
• Скрытое кэширование — почему константные объекты могут не компилироваться и как это обойти
• Проблемы с join и split — когда повторная итерация приводит к неопределённому поведению
• Оптимизация производительности — тесты показывают эквивалентность с ручным кодом
• Практические ловушки —
📹 Видео
Библиотека C/C++ разработчика #буст
Современные диапазоны могут заменить 90% ваших циклов — но есть подводные камни.
Разработчик из Яндекса разобрал детали реализации
ranges
, которые изменят ваш подход к обработке данных:• Композируемость алгоритмов — строите цепочки операций через
pipe operator
вместо вложенных циклов• Ленивые вычисления — всё выполняется за один проход, экономя память и время
• Скрытое кэширование — почему константные объекты могут не компилироваться и как это обойти
• Проблемы с join и split — когда повторная итерация приводит к неопределённому поведению
• Оптимизация производительности — тесты показывают эквивалентность с ручным кодом
• Практические ловушки —
double calls
, broken constness
и другие неочевидные эффекты📹 Видео
Библиотека C/C++ разработчика #буст
❤3
📰 Свеженькое из мира C++
Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.
😼 Интересное:
•Clang получает режим усиленной безопасности — добавление в Clang нового флага безопасности
• Range views — детали реализации, неочевидное поведение и влияние на производительность
•Сколько ты стоишь как разработчик — статья о том как оценить свою стоимость на рынке
😎 Полезное:
•Как избежать memory ordering проблем в многопоточном коде — полезные советы по улучшению многопоточного кода
• std::exchange — современный способ обмена значениями
🖨️Интересные проекты:
• Solidity — язык высокого уровня для реализации смарт-контрактов
• Flameshot — мощное, но простое в использовании программное обеспечение для создания снимков экрана
• Eclipse SUMO — пакет для моделирования дорожного движения с открытым исходным кодом
Библиотека C/C++ разработчика #буст
Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.
😼 Интересное:
•Clang получает режим усиленной безопасности — добавление в Clang нового флага безопасности
• Range views — детали реализации, неочевидное поведение и влияние на производительность
•Сколько ты стоишь как разработчик — статья о том как оценить свою стоимость на рынке
😎 Полезное:
•Как избежать memory ordering проблем в многопоточном коде — полезные советы по улучшению многопоточного кода
• std::exchange — современный способ обмена значениями
🖨️Интересные проекты:
• Solidity — язык высокого уровня для реализации смарт-контрактов
• Flameshot — мощное, но простое в использовании программное обеспечение для создания снимков экрана
• Eclipse SUMO — пакет для моделирования дорожного движения с открытым исходным кодом
Библиотека C/C++ разработчика #буст
Если нужно управлять сложными ресурсами, то можно воспользоваться костюмными deleters.
FILE*, сокеты, OpenGL объекты требуют специального освобождения
// Универсальный RAII wrapper
template<typename T, typename Deleter>
class Resource {
T resource;
Deleter deleter;
bool owns_resource = true;
public:
Resource(T resource, Deleter deleter) : resource(resource)
, deleter(deleter) {}
~Resource() { if(owns_resource) deleter(resource); }
Resource(Resource&& other) : resource(other.resource)
, deleter(std::move(other.deleter))
, owns_resource(other.owns_resource)
{ other.owns_resource = false; }
Resource(const Resource&) = delete;
T get() const { return resource; }
T release() { owns_resource = false; return resource; }
};
// Использование
auto file = Resource(fopen("data.txt", "r"),
[](FILE* f) { if(f) fclose(f); });
Для совместимости с STL удобно использовать
std::unique_ptr
с кастомным deleter.Библиотека C/C++ разработчика
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14🥰3
Попали в новый проект и видите море незнакомого C++ кода? Не тратьте часы на разбор каждой строчки.
Используйте простой, но эффективный промпт для ИИ-помощника:
Context: I'm starting a new position as backend developer and I have to start to understand how some functions are working
Technologies: C++, [добавьте ваши технологии: STL, Boost, Qt и т.д.]
You have to: explain me the code line by line
[ВСТАВЬТЕ ВАШ КОД СЮДА]
• Сложных template-конструкций
• Многопоточного кода с std::thread
• Низкоуровневых операций с памятью
• RAII и smart pointers
• STL алгоритмов и контейнеров
Библиотека C/C++ разработчика
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😁8❤5
При изменении CMakeLists.txt нужно вручную запускать переконфигурацию проекта, что отвлекает от основной работы.
Автоматическая синхронизация и мгновенное применение изменений CMake.
• CLion: автоматически или Ctrl+Shift+A → "Reload CMake Project"
• VSCode (с CMake Tools): F7 или через командную панель
• Visual Studio: соответствующая кнопка в CMake панели
• Перейдите в Settings → Build, Execution, Deployment → CMake
• Включите опцию "Reload CMake project on editing CMakeLists.txt files"
• Теперь при любом изменении CMakeLists.txt проект будет автоматически реконфигурироваться!
Библиотека C/C++ разработчика
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
При передаче больших объемов данных между процессами или в сетевых операциях происходит множественное копирование данных в память, что создает узкие места по производительности. Особенно критично в высоконагруженных системах реального времени.
Zero-Copy позволяет передавать данные без копирования в пользовательское пространство, используя системные вызовы sendfile() и splice() в Linux.
#include <sys/sendfile.h>
#include <fcntl.h>
// Отправка файла через сокет без копирования в userspace
int send_file_zerocopy(int socket_fd, const char* filename) {
int file_fd = open(filename, O_RDONLY);
off_t offset = 0;
struct stat file_stat;
fstat(file_fd, &file_stat);
// Прямая передача из ядра в сокет
ssize_t sent = sendfile(socket_fd, file_fd, &offset, file_stat.st_size);
close(file_fd);
return sent;
}
• Снижение использования CPU при передаче данных
• Уменьшение задержек за счет исключения системных вызовов copy
• Экономия памяти — данные не загружаются в пользовательское пространство
• Масштабируемость для высоконагруженных веб-серверов и прокси
Библиотека C/C++ разработчика
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍7❤1
😎 std::mdspan в C++23: многомерные данные без самодельных view
💡 В C++23 появился
❗ Ключевые возможности mdspan:
• настраиваемые политики размещения (row-major, column-major, stride)
• статические и динамические размерности в типе
• транспонирование и ROI без копирования данных
Основной фокус статьи — практические примеры использования: от базовой инициализации матриц до создания собственных политик доступа с проверками границ.
Особенно полезно для разработчиков высокопроизводительных систем, работающих с матрицами, изображениями и научными вычислениями.
Теперь вместо ручной арифметики указателей у вас единый тип и возможность писать универсальные функции без привязки к внутренней формуле offset'а.
👉 Статья
Библиотека C/C++ разработчика
#буст
💡 В C++23 появился
std::mdspan
— стандартизованный способ адресации многомерных данных без самодельных обвязок на указателях и макросах.❗ Ключевые возможности mdspan:
• настраиваемые политики размещения (row-major, column-major, stride)
• статические и динамические размерности в типе
• транспонирование и ROI без копирования данных
Основной фокус статьи — практические примеры использования: от базовой инициализации матриц до создания собственных политик доступа с проверками границ.
Особенно полезно для разработчиков высокопроизводительных систем, работающих с матрицами, изображениями и научными вычислениями.
Теперь вместо ручной арифметики указателей у вас единый тип и возможность писать универсальные функции без привязки к внутренней формуле offset'а.
👉 Статья
Библиотека C/C++ разработчика
#буст
🔥3👍1
🔥О реальной ситуации на рынке junior-разработчиков: почему сейчас лучшее время для входа в IT
💡 Сергей Попов, директор образовательного продукта в Скиллбокс и ментор в Хекслите, развенчивает мифы о рынке junior-специалистов.
❗ Ключевые моменты интервью:
• в России не хватает 750 тысяч IT-специалистов по данным Минцифры
• зарплаты стажёров составляют 40-50 тысяч рублей с перспективой роста
• каждая крупная компания запускает собственные стажировочные программы
Основной фокус — реальные возможности для входа в IT через стажировки, корпоративные университеты и различные образовательные треки от крупных компаний.
Главный инсайт: конкуренция среди джунов действительно высока, но компании активно борются за кадры, создавая всё больше возможностей для новичков. Ключ к успеху — правильно подобрать формат обучения
👉 Видео
Библиотека C/C++ разработчика
#буст
«Джунов много, а вакансий мало... Невозможно найти первую работу!» — такие комментарии часто встречаются в IT-сообществах
💡 Сергей Попов, директор образовательного продукта в Скиллбокс и ментор в Хекслите, развенчивает мифы о рынке junior-специалистов.
❗ Ключевые моменты интервью:
• в России не хватает 750 тысяч IT-специалистов по данным Минцифры
• зарплаты стажёров составляют 40-50 тысяч рублей с перспективой роста
• каждая крупная компания запускает собственные стажировочные программы
Основной фокус — реальные возможности для входа в IT через стажировки, корпоративные университеты и различные образовательные треки от крупных компаний.
Главный инсайт: конкуренция среди джунов действительно высока, но компании активно борются за кадры, создавая всё больше возможностей для новичков. Ключ к успеху — правильно подобрать формат обучения
👉 Видео
Библиотека C/C++ разработчика
#буст
😁8🥱3❤1🔥1
Perf — мощный профайлер для Linux, который поможет найти узкие места в вашем C++ коде.
# Запись профиля
perf record ./your_program
# Просмотр результатов
perf report
# Профилирование по CPU
perf stat ./your_program
# Анализ кэш-промахов
perf stat -e cache-misses ./your_program
• Время выполнения функций
• Cache misses
• Branch mispredictions
• Memory bandwidth
Библиотека C/C++ разработчика
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍2🤩1
Элегантная работа с multiple return values и сложными структурами.
#include <map>
#include <tuple>
#include <array>
// Функция возвращает несколько значений
std::tuple<int, std::string, double> get_data() {
return {42, "hello", 3.14};
}
struct Point { int x, y; };
int main() {
// 1. Распаковка tuple
auto [id, name, price] = get_data();
std::cout << id << " " << name << " " << price << "\n";
// 2. Распаковка struct
Point p{10, 20};
auto [x, y] = p;
std::cout << "Point: " << x << ", " << y << "\n";
// 3. Распаковка array
std::array<int, 3> arr{1, 2, 3};
auto [first, second, third] = arr;
// 4. Распаковка map::insert результата
std::map<std::string, int> m;
auto [iterator, inserted] = m.insert({"key", 42});
if (inserted) {
std::cout << "Inserted: " << iterator->first << "\n";
}
// 5. Итерация по map с распаковкой
for (const auto& [key, value] : m) {
std::cout << key << " -> " << value << "\n";
}
// 6. Распаковка с модификаторами
auto& [rx, ry] = p; // Ссылки на члены
rx = 100; // Изменяем оригинал
}
Более читаемый код при работе с парами, tuple, структурами
Библиотека C/C++ разработчика
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍2
⚡️ Constexpr эволюция — от C++11 до C++23
Хотите больше вычислений во время компиляции для максимальной производительности?
constexpr развивался от простых функций в C++11 до полноценного compile-time программирования в C++20. Позволяет выполнять сложную логику на этапе компиляции.
💡 C++11 — только простые функции:
💡 C++14 — циклы и условия:
💡 C++20 — std::vector и dynamic memory:
💡 C++23 — constexpr std::string:
Библиотека C/C++ разработчика
#буст
Хотите больше вычислений во время компиляции для максимальной производительности?
constexpr развивался от простых функций в C++11 до полноценного compile-time программирования в C++20. Позволяет выполнять сложную логику на этапе компиляции.
constexpr int factorial(int n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}
constexpr int sum_array(const int* arr, size_t size) {
int sum = 0;
for (size_t i = 0; i < size; ++i) {
sum += arr[i];
}
return sum;
}
constexpr std::vector<int> make_sequence(int n) {
std::vector<int> result;
for (int i = 0; i < n; ++i) {
result.push_back(i * i);
}
return result;
}
constexpr std::string process_text() {
std::string result = "Hello, ";
result += "constexpr world!";
return result;
}
constexpr auto text = process_text(); // Во время компиляции!
Библиотека C/C++ разработчика
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13❤3👍3
👾 Скрытые ловушки встроенной сборки в C++
В видео разбирается фундаментальная проблема несовместимости моделей параллелизма C++ (RC11) и x86, возникающая при использовании встроенной сборки.
❗ Ключевые моменты доклада:
• невременные хранилища (non-temporal stores) обходят кэш и нарушают синхронизацию acquire-release
• стандартные режимы доступа RC11 не могут корректно моделировать встроенную сборку
• предлагается расширение модели с тремя новыми режимами доступа: TSO, non-temporal и store fence
Основной фокус — разработка семантики, которая позволяет корректно совмещать высокоуровневые конструкции C++ с низкоуровневыми инструкциями x86 в одной программе.
Вы поймёте, почему простое добавление inline assembly может привести к data race и нарушению корректности многопоточной программы, даже если код выглядит безопасным с точки зрения модели памяти C++.
👉 Видео
Библиотека C/C++ разработчика
#буст
В видео разбирается фундаментальная проблема несовместимости моделей параллелизма C++ (RC11) и x86, возникающая при использовании встроенной сборки.
❗ Ключевые моменты доклада:
• невременные хранилища (non-temporal stores) обходят кэш и нарушают синхронизацию acquire-release
• стандартные режимы доступа RC11 не могут корректно моделировать встроенную сборку
• предлагается расширение модели с тремя новыми режимами доступа: TSO, non-temporal и store fence
Основной фокус — разработка семантики, которая позволяет корректно совмещать высокоуровневые конструкции C++ с низкоуровневыми инструкциями x86 в одной программе.
Вы поймёте, почему простое добавление inline assembly может привести к data race и нарушению корректности многопоточной программы, даже если код выглядит безопасным с точки зрения модели памяти C++.
👉 Видео
Библиотека C/C++ разработчика
#буст
🔥2😁1