👋 Канал OTUS в Telegram!
Посты от приглашенных гостей из IT-тусовки, полезные статьи, подборки вакансий от партнеров ➞
Подробнее

Курсы

Программирование
Архитектор программного обеспечения Архитектура и шаблоны проектирования Архитектор высоких нагрузок Backend-разработчик на PHP
-30%
Scala-разработчик
-30%
Алгоритмы и структуры данных
-30%
Разработчик на Spring Framework
-20%
Разработчик Golang
-25%
C# ASP.NET Core разработчик
-25%
iOS-разработчик. Базовый курс
-25%
Android-разработчик. Базовый курс PostgreSQL Framework Laravel Разработчик Java Fullstack разработчик JavaScript Android-разработчик. Продвинутый курс Разработчик программных роботов (RPA) на базе UiPath и PIX Разработчик игр на Unity Vue.js разработчик Agile Project Manager в IT Интенсив «Оптимизация в Java» Супер - практикум по использованию и настройке GIT
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02
Решаем проблему конкурентного доступа с помощью Lock-Free

C___Deep_27.12_site-5020-00967a.png

В одной из прошлых заметок мы приводили пример конкурентной обработки двух конфликтных запросов, которые возникли в связи с одновременным бронированием одного и того же номера двумя разными менеджерами отеля.

Проблема атомарности на практическом примере

C___Deep_14.12_site-5020-4bbf4c.png

В одной из предыдущих заметок мы упоминали о Lock-Free алгоритмах и сложностях, с ними связанных. Какая ситуация вообще приводит к проблемам? Лучше всего понять это помогает простейший пример бронирования номеров в отеле.

Будьте внимательны, используя Lock-Free алгоритмы!

Cplus_Deep_11.12_site-5020-1f5428.png

Не секрет, что Lock-Free алгоритмы и структуры данных существенно усложняют проект. Это подтверждается как моим собственным опытом, так и Core Guidelines (набором рекомендаций и правил по написанию кода на С++).

Синхронная асинхронность в C++

С___Deep_10-5020-8d2073.09_site.png

Наверняка все, кто изучал старый добрый стандарт C++11, знают о существовании в стандартной библиотеке вызова std::async, который позволяет выполнить некий код асинхронно (более точно – поведение указывается первым параметром вызова).

Согласно документации, вызов с параметром std::launch::async обещает выполнить пользовательский код в отдельном потоке. Посмотрим на приведённый ниже код.

Какие есть проблемы у систем сборки языка C++?

С___Deep_23-5020-25b88f.08_Site.png

Проблема только одна – отсутствие каких бы то ни было стандартных систем сборки. Но нас спасут нестандартные! В данном случае великий и ужасный CMake, в котором есть две переменные с не совсем очевидными отличиями.

Сделайте «снимок» кода С++, посмотрим что у вас!

С___Deep_9-5020-7511bd.10_site.png

Современный C++ породил странный страх сделать что-то недостаточно эффективно. По этой причине в коде часто можно встретить std::move совершенно не к месту. Или какие-то сложные телодвижения, нацеленные на избавление от копирования возвращаемого значения.

Иногда кажется, что это для многих стало чем-то вроде фобии. А-а-а-а, я тут лишнего скопировал! И пропал на час, придумывая как избавиться от него.