Библиотека C/C++ разработчика | cpp, boost, qt
19.5K subscribers
1.99K photos
64 videos
16 files
4.26K links
Все самое полезное для плюсовика и сишника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/d6cd2932

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
Download Telegram
🍪 Почему compare_exchange_weak может "случайно" провалиться?

Многие разработчики думают, что compare_exchange_weak — это просто облегчённая версия compare_exchange_strong. На самом деле у неё есть неочевидное поведение: она может вернуть false, даже если значение совпадает.


🍿 Как это работает:

На некоторых архитектурах (ARM, PowerPC) атомарные операции реализованы через инструкции load-link/store-conditional (LL/SC). Процессор помечает адрес памяти при чтении и проверяет при записи — не изменился ли он.

Но вот проблема: между LL и SC может произойти spurious failure — ложный отказ. Это случается, если:

• Произошло переключение контекста
• Кеш-линия была вытеснена
• Другой процессор обратился к соседней памяти

std::atomic<int> counter{0};
int expected = 0;
// Может вернуть false, даже если counter == 0!
bool success = counter.compare_exchange_weak(expected, 1);


✈️ На x86 такого нет — там используется инструкция CMPXCHG, которая атомарна на уровне железа. Но спецификация C++ допускает spurious failures для переносимости.


💡 Практический вывод:

Всегда используй compare_exchange_weak в цикле. Для однократных попыток бери compare_exchange_strong — она гарантирует, что false означает реальное несовпадение значений.


📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5👍3
"Timestamp — это просто timestamp, какая разница?" — так думают многие, пока не сталкиваются с багами при работе со временем в распределенных системах или при логировании событий.


В C++20 добавили целых 5 новых типов часов, и каждый решает свою специфическую задачу.


❗️ Ключевые моменты статьи:

utc_clock — учитывает leap seconds для точной синхронизации с реальным временем;
tai_clock и gps_clock — работают без leap seconds для научных вычислений и спутниковых систем;
file_clock — обеспечивает предсказуемую работу с файловыми таймстемпами;
local_t — позволяет явно управлять часовыми поясами и DST.

Основной фокус — на различиях между временными шкалами. Особенно актуально для систем логирования, работы с GPS-данными, файловыми системами и любых задач, где критична точность временных меток.


👉 Больше подробностей


📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#буст
👍3🔥21
✏️ std::execution — параллелизм одной строкой

Добавление execution policy превращает обычный алгоритм в параллельный (sort, for_each, transform и др.).

🙂 Последовательно (C++98):

std::vector<int> data(1'000'000);
std::sort(data.begin(), data.end());


😃 Параллельно (C++17):

#include <execution>

// Автоматическая векторизация + многопоточность
std::sort(std::execution::par_unseq,
data.begin(), data.end());


❗️Политики:

std::execution::seq        // Последовательно
std::execution::par // Параллельно
std::execution::par_unseq // Параллельно + векторизация
std::execution::unseq // Только векторизация (C++20)


‼️ Замечание: Измеряйте производительность — параллелизм не всегда быстрее!

📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
👏2👾1