❌

Normal view

Один счётчик, десять потоков и неправильный результат: разбираемся в многопоточности C++

Представим простую задачу: десять потоков должны увеличить общий счётчик по миллиону раз. Математика элементарная — в результате ожидаем десять миллионов.

Но программа может вывести совсем другое число. Причём ошибка не обязательно будет повторяться при каждом запуске.

Разберёмся, почему так происходит, как исправить проблему с помощью std::mutex и std::atomic, когда нужны std::condition_variable и std::future, а также чем std::jthread удобнее обычного std::thread.

Все примеры рассчитаны на C++20, если не указано иное.

Читать далее

NFS нельзя оставлять открытым: шифрование, отказоустойчивость и никакого VIP

NFS часто выбирают за простоту: развернул сервер, опубликовал каталог, смонтировал его на клиентах – и файловый сервис готов. Но когда хранилище попадает в критичный контур, одной такой конфигурации уже недостаточно.

Требования к информационной безопасности и высокой доступности ставят новые инженерные вопросы. Как зашифровать NFS-трафик, не меняя приложения? Как обеспечить актуальность данных на резервном узле? Кто и в какой последовательности поднимает сервисы после аварии? И как переключить клиентов без виртуального IP (VIP)?

Привет, Хабр! Меня зовут Егор Шманев, я системный инженер в К2Тех. В статье расскажу, как мы решили эти задачи и что потребовалось, чтобы отдельные компоненты заработали как единый файловый сервис.

Читать далее

Где Runtime Async в.NET 11 экономит память, а где нет

В.NET 11 привычный механизм async/await меняется: управление приостановкой методов переходит к рантайму, а JIT получает новые возможности для оптимизации. Но насколько это снижает аллокации в реальном коде и почему результаты замеров иногда противоречат друг другу? Разбираем Runtime Async на примере бенчмарков, сравниваем результаты с классической реализацией и выясняем, в каких сценариях выигрыш действительно заметен.

Изучить результаты тестов
❌