Многие разработчики думают, что
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);Всегда используй compare_exchange_weak в цикле. Для однократных попыток бери compare_exchange_strong — она гарантирует, что false означает реальное несовпадение значений.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5👍3
Forwarded from Библиотека задач по C++ | тесты, код, задания
Сколько копирований гарантировано в C++17?
Anonymous Quiz
42%
0
27%
1
9%
2
17%
Зависит от компилятора
5%
UB
😁1🥱1
"Timestamp — это просто timestamp, какая разница?" — так думают многие, пока не сталкиваются с багами при работе со временем в распределенных системах или при логировании событий.
В C++20 добавили целых 5 новых типов часов, и каждый решает свою специфическую задачу.
❗️ Ключевые моменты статьи:
•
utc_clock — учитывает leap seconds для точной синхронизации с реальным временем;•
tai_clock и gps_clock — работают без leap seconds для научных вычислений и спутниковых систем;•
file_clock — обеспечивает предсказуемую работу с файловыми таймстемпами;•
local_t — позволяет явно управлять часовыми поясами и DST.Основной фокус — на различиях между временными шкалами. Особенно актуально для систем логирования, работы с GPS-данными, файловыми системами и любых задач, где критична точность временных меток.
👉 Больше подробностей
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст
👍3🔥2❤1
Добавление execution policy превращает обычный алгоритм в параллельный (sort, for_each, transform и др.).
std::vector<int> data(1'000'000);
std::sort(data.begin(), data.end());
#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