🧠 C++ хитрая задача — SPSC-кольцевая очередь без блокировок (lock-free), корректная по memory ordering
Задача.
Реализуйте обобщённую кольцевую очередь single-producer / single-consumer (один писатель, один читатель), которая:
- не использует мьютексы;
- корректна по отношению к перезагрузкам CPU/компиляторным переупорядочиваниям (правильные `memory_order`);
- не падает на гонках при чтении/записи индексов;
- работает на произвольных типах
- имеет фиксированную ёмкость
Требования:
1)
2)
3) Между продюсером и консюмером ровно по одному потоку.
4) Без UB: корректно управлять временем жизни
5) Отсутствие ложных срабатываний на гонки: индексы —
Решение
Ключевая идея: у нас **отдельные** атомики для `head` (читатель продвигает) и `tail` (писатель продвигает).
- Писатель смотрит `head` только с `memory_order_acquire` (наблюдать продвинутые позиции),
обновляет `tail` с `memory_order_release`.
- Читатель зеркально: читает `tail` с `acquire`, продвигает `head` с `release`.
Так мы гарантируем, что **запись объекта** произойдёт до публикации индекса, а **чтение** — после наблюдения индекса.
Частые ошибки (и почему это «хитро»):
- Неверные порядки памяти. seq_cst «вылечит», но дорого; relaxed везде — сломает HB-отношения. Нужны именно пары release/acquire на публикации индексов.
- Забыли разрушить объект в слоте. Утечки и нарушение инвариантов времени жизни.
- Модуль через % и N не степень 2. Работает, но медленнее; очень заметно на горячих путях.
- Многопоточность не SPSC. Даже два продюсера ломают модель: нужны дополнительные атомики/барьеры (или MPMC структура).
- false sharing на head_/tail_. Без выравнивания производительность деградирует на нагрузке.
Задача.
Реализуйте обобщённую кольцевую очередь single-producer / single-consumer (один писатель, один читатель), которая:
- не использует мьютексы;
- корректна по отношению к перезагрузкам CPU/компиляторным переупорядочиваниям (правильные `memory_order`);
- не падает на гонках при чтении/записи индексов;
- работает на произвольных типах
T
(в том числе не `trivially copyable`);- имеет фиксированную ёмкость
N
, лучше степенью двойки для дешёвого модуля через маску.Требования:
1)
try_push(T)
— помещает элемент, если не переполнено; возвращает false
иначе. 2)
try_pop(T&)
— извлекает элемент, если не пусто; возвращает false
иначе. 3) Между продюсером и консюмером ровно по одному потоку.
4) Без UB: корректно управлять временем жизни
T
(placement new / явный деструктор). 5) Отсутствие ложных срабатываний на гонки: индексы —
std::atomic<size_t>
с правильными порядками.Ключевая идея: у нас **отдельные** атомики для `head` (читатель продвигает) и `tail` (писатель продвигает).
- Писатель смотрит `head` только с `memory_order_acquire` (наблюдать продвинутые позиции),
обновляет `tail` с `memory_order_release`.
- Читатель зеркально: читает `tail` с `acquire`, продвигает `head` с `release`.
Так мы гарантируем, что **запись объекта** произойдёт до публикации индекса, а **чтение** — после наблюдения индекса.
Частые ошибки (и почему это «хитро»):
- Неверные порядки памяти. seq_cst «вылечит», но дорого; relaxed везде — сломает HB-отношения. Нужны именно пары release/acquire на публикации индексов.
- Забыли разрушить объект в слоте. Утечки и нарушение инвариантов времени жизни.
- Модуль через % и N не степень 2. Работает, но медленнее; очень заметно на горячих путях.
- Многопоточность не SPSC. Даже два продюсера ломают модель: нужны дополнительные атомики/барьеры (или MPMC структура).
- false sharing на head_/tail_. Без выравнивания производительность деградирует на нагрузке.
👍8🔥6❤3🗿2🥰1
📦 C++ обертка для SQLite с расширенными возможностями ⚙️
Библиотека boost_sqlite предоставляет удобный интерфейс для работы с SQLite в C++. Она поддерживает типизированные запросы, подготовленные выражения, функции на основе JSON и пользовательские функции. Библиотека не скрывает C-API SQLite, а дополняет его.
🚀Основные моменты:
- Типизированные запросы и подготовленные выражения
- Поддержка JSON и пользовательских функций
- Виртуальные таблицы и хуки событий
- Легкая интеграция с существующими проектами
📌 GitHub: https://github.com/klemens-morgenstern/sqlite
@cpluspluc
Библиотека boost_sqlite предоставляет удобный интерфейс для работы с SQLite в C++. Она поддерживает типизированные запросы, подготовленные выражения, функции на основе JSON и пользовательские функции. Библиотека не скрывает C-API SQLite, а дополняет его.
🚀Основные моменты:
- Типизированные запросы и подготовленные выражения
- Поддержка JSON и пользовательских функций
- Виртуальные таблицы и хуки событий
- Легкая интеграция с существующими проектами
📌 GitHub: https://github.com/klemens-morgenstern/sqlite
@cpluspluc
👍11❤7🔥3🥰1
🧩 Умный текстовый анализатор для обработки данных
Этот репозиторий предлагает инструменты для анализа и обработки текстовой информации. Он включает в себя функции для извлечения ключевых слов, анализа частоты слов и других полезных методов, которые помогут в работе с текстовыми данными.
🚀 Основные моменты:
- Извлечение ключевых слов из текста
- Анализ частоты слов и фраз
- Поддержка различных форматов входных данных
- Легкий в использовании интерфейс
📌 GitHub: https://github.com/conanhujinming/text_dedup
@cpluspluc
Этот репозиторий предлагает инструменты для анализа и обработки текстовой информации. Он включает в себя функции для извлечения ключевых слов, анализа частоты слов и других полезных методов, которые помогут в работе с текстовыми данными.
🚀 Основные моменты:
- Извлечение ключевых слов из текста
- Анализ частоты слов и фраз
- Поддержка различных форматов входных данных
- Легкий в использовании интерфейс
📌 GitHub: https://github.com/conanhujinming/text_dedup
@cpluspluc
👍6🔥3❤1
Тренировки Яндекса по алгоритмам: от решения задач к карьере в IT
Вас ждет 4 недели практики, чтобы систематизировать знания и научиться решать задачи, которые встречаются на собеседованиях и в реальной работе.
Программа включает восемь ключевых тем: множества, словари, динамическое программирование и не только. Лекции и разборы будет вести Михаил Густокашин — директор Центра студенческих олимпиад ВШЭ и тренер чемпионов мира по программированию.
Топ-300 участников смогут пропустить контест при отборе на стажировку в Яндекс по направлениям бэкенд, фронтенд, мобилка и пройти пробное техническое собеседование. А еще лидеры рейтинга смогут получить персональные карьерные консультации.
Подать заявку можно до 29 сентября.
Вас ждет 4 недели практики, чтобы систематизировать знания и научиться решать задачи, которые встречаются на собеседованиях и в реальной работе.
Программа включает восемь ключевых тем: множества, словари, динамическое программирование и не только. Лекции и разборы будет вести Михаил Густокашин — директор Центра студенческих олимпиад ВШЭ и тренер чемпионов мира по программированию.
Топ-300 участников смогут пропустить контест при отборе на стажировку в Яндекс по направлениям бэкенд, фронтенд, мобилка и пройти пробное техническое собеседование. А еще лидеры рейтинга смогут получить персональные карьерные консультации.
Подать заявку можно до 29 сентября.
❤4👍4
librats — это современная библиотека для пиринговых сетей, обеспечивающая высокую производительность и простоту использования. Она предлагает кроссплатформенные решения с поддержкой автоматического обнаружения узлов, NAT-траверсала и безопасной передачи данных.
🚀 Основные моменты:
- Высокая производительность с использованием C++17
- Поддержка DHT, mDNS и STUN для обнаружения узлов
- Безопасная передача данных с шифрованием и проверкой целостности
- Удобный API для работы с событиями и сообщениями
- Кроссплатформенность: Windows, Linux, macOS
📌 GitHub: https://github.com/DEgitx/librats
#cpp
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍3🥰1
🎮⚓ Консольная игра "Морской бой" на C++
Классическая игра "Морской бой" в консольном формате. Реализована на C++ с использованием ООП. Игроки могут размещать свои корабли на 10x10 поле и сражаться с компьютерным противником.
🚀Основные моменты:
- 10 кораблей разных размеров
- Редактор размещения кораблей
- Игра против бота
- Интуитивно понятный интерфейс
📌 GitHub: https://github.com/Savvas200/BattleShip-Console-Game
@cpluspluc
Классическая игра "Морской бой" в консольном формате. Реализована на C++ с использованием ООП. Игроки могут размещать свои корабли на 10x10 поле и сражаться с компьютерным противником.
🚀Основные моменты:
- 10 кораблей разных размеров
- Редактор размещения кораблей
- Игра против бота
- Интуитивно понятный интерфейс
📌 GitHub: https://github.com/Savvas200/BattleShip-Console-Game
@cpluspluc
❤8❤🔥2👍2🥰1
📂 Ввод-вывод в C: от fopen до системных вызовов
📅 4 сентября | 20:00 мск | бесплатно
На вебинаре разберём:
📜 Стандартные функции C: fopen, fread, fwrite, printf, scanf
⚡️ Буферизацию и почему fflush() не всегда срабатывает
🛠 Системные вызовы: read, write, open vs стандартная библиотека
🚫 Как избежать типичных ошибок при работе с файлами и потоками
Полезно для:
💡 Junior-разработчиков и тех, кто хочет глубже понять подсистему I/O в C и ОС
👉 Регистрируйтесь:
https://otus.pw/6MBa/
Занятие приурочено к старту курса "Программист С", обучение на котором позволит не только глубоко погрузиться в возможности языка С, но и изучить низкоуровневые особенности устройства UNIX-совместимых ОС и ОС семейства Windows
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ", ИНН: 9705100963
📅 4 сентября | 20:00 мск | бесплатно
На вебинаре разберём:
📜 Стандартные функции C: fopen, fread, fwrite, printf, scanf
⚡️ Буферизацию и почему fflush() не всегда срабатывает
🛠 Системные вызовы: read, write, open vs стандартная библиотека
🚫 Как избежать типичных ошибок при работе с файлами и потоками
Полезно для:
💡 Junior-разработчиков и тех, кто хочет глубже понять подсистему I/O в C и ОС
👉 Регистрируйтесь:
https://otus.pw/6MBa/
Занятие приурочено к старту курса "Программист С", обучение на котором позволит не только глубоко погрузиться в возможности языка С, но и изучить низкоуровневые особенности устройства UNIX-совместимых ОС и ОС семейства Windows
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ", ИНН: 9705100963
❤1
🐘 Tarantool — необычная платформа, сочетающая in-memory базу данных с полноценным сервером приложений на Lua. Проект имеет два движка хранения: in-memory с WAL и LSM-дерево, поддерживает ANSI SQL и асинхронную репликацию.
Инструмент имеет встроенный JIT-компилятор LuaJIT, позволяющий исполнять бизнес-логику прямо рядом с данными. При этом сохраняется совместимость с внешними СУБД вроде PostgreSQL через коннекторы. Проект полезен для высоконагруженных веб-сервисов, кэширующих слоёв и систем обработки очередей сообщений.
🤖 GitHub
Инструмент имеет встроенный JIT-компилятор LuaJIT, позволяющий исполнять бизнес-логику прямо рядом с данными. При этом сохраняется совместимость с внешними СУБД вроде PostgreSQL через коннекторы. Проект полезен для высоконагруженных веб-сервисов, кэширующих слоёв и систем обработки очередей сообщений.
🤖 GitHub
❤6👍6🥰2😁1
🛠️ Оптимизированные компиляторы с LLVM
LLVM — это мощный инструмент для создания высокоэффективных компиляторов и сред выполнения. Он включает в себя множество компонентов, таких как Clang для компиляции C и C++, а также библиотеки и утилиты для работы с промежуточными представлениями.
🚀 Основные моменты:
- Поддержка множества языков программирования.
- Включает стандартную библиотеку libc++.
- Инструменты для анализа и оптимизации биткода.
- Активное сообщество и поддержка.
📌 GitHub: https://github.com/llvm/llvm-project
#cpp
LLVM — это мощный инструмент для создания высокоэффективных компиляторов и сред выполнения. Он включает в себя множество компонентов, таких как Clang для компиляции C и C++, а также библиотеки и утилиты для работы с промежуточными представлениями.
🚀 Основные моменты:
- Поддержка множества языков программирования.
- Включает стандартную библиотеку libc++.
- Инструменты для анализа и оптимизации биткода.
- Активное сообщество и поддержка.
📌 GitHub: https://github.com/llvm/llvm-project
#cpp
👍8❤6🔥2
🚀 Docker + C++ pro tip
Для C++ приложений используйте multi-stage build:
сначала соберите бинарь в большом окружении с компилятором, а затем перенесите его в минимальный образ (например, `alpine`).
💡 Такой подход:
- уменьшает размер образа с сотен МБ до десятков,
- убирает ненужные компиляторы и dev-библиотеки,
- даёт быстрый и чистый production-контейнер.
@cpluspluc
Для C++ приложений используйте multi-stage build:
сначала соберите бинарь в большом окружении с компилятором, а затем перенесите его в минимальный образ (например, `alpine`).
# Этап сборки
FROM gcc:13 AS builder
WORKDIR /src
COPY . .
RUN g++ -O3 -static -o app main.cpp
# Финальный минимальный образ
FROM alpine:3.20
WORKDIR /app
COPY --from=builder /src/app .
CMD ["./app"]
💡 Такой подход:
- уменьшает размер образа с сотен МБ до десятков,
- убирает ненужные компиляторы и dev-библиотеки,
- даёт быстрый и чистый production-контейнер.
@cpluspluc
👍14❤6🔥5
Большая конференция для тех, кто живёт бэкендом и хочет видеть, что происходит под капотом технологий, меняющих индустрию.
📅 4 октября в Москве и онлайн пройдёт «Я про бэкенд» — событие, где инженеры и исследователи делятся тем, как строятся сервисы, работающие каждый день для миллионов людей.
В программе — практический опыт о том, как справляться с растущими нагрузками, внедрять ML в продакшн и вытаскивать максимум из железа и инфраструктуры.
Уже заявлены доклады:
🔸 Антон Полднев (Яндекс Реклама) — как рекомендательный движок экономит сотни тысяч CPU в инфраструктуре
🔸 Дмитрий Погорелов (VK) — эволюция рекомендательного движка VK и перезапуск ленты
🔸 Михаил Чебаков (Т-Банк) — как прятать сложность LLM-инференса за понятными числами
🔸 Андрей Шукшов (Яндекс Поиск) — LLM Inside: максимум из decoder attention на GPU
🔸 Алёна Васильева (Шедеврум) — архитектура для ML-моделей и длинного инференса
🔸 Никита Сикалов (Яндекс.Поиск) — эволюция технологий реалтайм-индексации
И это только начало — полный список найдете на сайте. Если хотите понять, куда движется бэкенд и какие вызовы ждут завтра, присоединяйтесь тут!
📅 4 октября в Москве и онлайн пройдёт «Я про бэкенд» — событие, где инженеры и исследователи делятся тем, как строятся сервисы, работающие каждый день для миллионов людей.
В программе — практический опыт о том, как справляться с растущими нагрузками, внедрять ML в продакшн и вытаскивать максимум из железа и инфраструктуры.
Уже заявлены доклады:
🔸 Антон Полднев (Яндекс Реклама) — как рекомендательный движок экономит сотни тысяч CPU в инфраструктуре
🔸 Дмитрий Погорелов (VK) — эволюция рекомендательного движка VK и перезапуск ленты
🔸 Михаил Чебаков (Т-Банк) — как прятать сложность LLM-инференса за понятными числами
🔸 Андрей Шукшов (Яндекс Поиск) — LLM Inside: максимум из decoder attention на GPU
🔸 Алёна Васильева (Шедеврум) — архитектура для ML-моделей и длинного инференса
🔸 Никита Сикалов (Яндекс.Поиск) — эволюция технологий реалтайм-индексации
И это только начало — полный список найдете на сайте. Если хотите понять, куда движется бэкенд и какие вызовы ждут завтра, присоединяйтесь тут!
❤3🔥1
📌 Git Revert vs Git Reset: В чём разница? 🔄
Когда вы делаете ошибку в Git, важно понимать, как правильно её исправить. Два самых популярных способа —
### 🔹 Git Revert
- Создаёт новый коммит, который отменяет изменения из проблемного коммита.
- История сохраняется полностью — всё видно, даже ошибка.
- Безопасный вариант для публичных веток (например, `main`).
- Не удаляет коммиты — просто "откатывает" их эффект.
> 💡 Пример:
> C1 → C2 → C3 (ошибка) → C4: Revert C3
> Результат: ошибка отменена, но история остаётся полной.
🔹 Git Reset
- Удаляет коммит(ы) из истории.
- Изменяет историю репозитория — может быть опасно, если уже был пуш.
- Подходит только для локальных изменений или ещё не опубликованных коммитов.
- Есть три режима:
> 💡 Пример:
> C1 → C2 → C3 (ошибка) → C3 убрано
> Результат: история обрезана, как будто коммит никогда не был.
💡 Вывод:
📌 Понимание этих команд — ключ к уверенной работе с Git!
#Git #DevOps #Programming #junior
Когда вы делаете ошибку в Git, важно понимать, как правильно её исправить. Два самых популярных способа —
git revert
и git reset
. Но они работают по-разному!### 🔹 Git Revert
- Создаёт новый коммит, который отменяет изменения из проблемного коммита.
- История сохраняется полностью — всё видно, даже ошибка.
- Безопасный вариант для публичных веток (например, `main`).
- Не удаляет коммиты — просто "откатывает" их эффект.
> 💡 Пример:
> C1 → C2 → C3 (ошибка) → C4: Revert C3
> Результат: ошибка отменена, но история остаётся полной.
🔹 Git Reset
- Удаляет коммит(ы) из истории.
- Изменяет историю репозитория — может быть опасно, если уже был пуш.
- Подходит только для локальных изменений или ещё не опубликованных коммитов.
- Есть три режима:
soft
, mixed
, hard
.> 💡 Пример:
> C1 → C2 → C3 (ошибка) → C3 убрано
> Результат: история обрезана, как будто коммит никогда не был.
💡 Вывод:
revert
— безопасный и прозрачный способ отменить изменения. reset
— мощный инструмент, но требует осторожности.📌 Понимание этих команд — ключ к уверенной работе с Git!
#Git #DevOps #Programming #junior
👍21❤4🥰1
🔥 Успех в IT = скорость + знания + окружение
Здесь ты найдёшь всё это — коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Собеседования DS: t.me/machinelearning_interview
C++ t.me/cpluspluc
Docker: t.me/DevopsDocker
Хакинг: t.me/linuxkalii
Devops: t.me/DevOPSitsec
Data Science: t.me/data_analysis_ml
Javascript: t.me/javascriptv
C#: t.me/csharp_1001_notes
Java: t.me/java_library
Базы данных: t.me/sqlhub
Python собеседования: t.me/python_job_interview
Мобильная разработка: t.me/mobdevelop
Golang: t.me/Golang_google
React: t.me/react_tg
Rust: t.me/rust_code
ИИ: t.me/vistehno
PHP: t.me/phpshka
Android: t.me/android_its
Frontend: t.me/front
Big Data: t.me/bigdatai
МАТЕМАТИКА: t.me/data_math
Kubernets: t.me/kubernetc
Разработка игр: https://t.me/gamedev
Haskell: t.me/haskell_tg
Физика: t.me/fizmat
💼 Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.me/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: t.me/memes_prog
🇬🇧Английский: t.me/english_forprogrammers
🧠ИИ: t.me/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Подпишись, если хочешь быть в числе тех, кого зовут в топовые проекты!
Здесь ты найдёшь всё это — коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Собеседования DS: t.me/machinelearning_interview
C++ t.me/cpluspluc
Docker: t.me/DevopsDocker
Хакинг: t.me/linuxkalii
Devops: t.me/DevOPSitsec
Data Science: t.me/data_analysis_ml
Javascript: t.me/javascriptv
C#: t.me/csharp_1001_notes
Java: t.me/java_library
Базы данных: t.me/sqlhub
Python собеседования: t.me/python_job_interview
Мобильная разработка: t.me/mobdevelop
Golang: t.me/Golang_google
React: t.me/react_tg
Rust: t.me/rust_code
ИИ: t.me/vistehno
PHP: t.me/phpshka
Android: t.me/android_its
Frontend: t.me/front
Big Data: t.me/bigdatai
МАТЕМАТИКА: t.me/data_math
Kubernets: t.me/kubernetc
Разработка игр: https://t.me/gamedev
Haskell: t.me/haskell_tg
Физика: t.me/fizmat
💼 Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.me/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: t.me/memes_prog
🇬🇧Английский: t.me/english_forprogrammers
🧠ИИ: t.me/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Подпишись, если хочешь быть в числе тех, кого зовут в топовые проекты!
👍1
🧠 C++ хитрая и интересная задача (lock-free)
Задача: реализуй однопоточный производитель / однопоточный потребитель (SPSC) кольцевой буфер без мьютексов — только на
Требования:
-
- Ёмкость — степень двойки; индексация — маской.
- Гарантируется ровно один поток-производитель и ровно один поток-потребитель.
Скелет:
💡 Подсказки:
- Пиши в buf[tail & mask], затем публикуй запись:
tail.store(next, std::memory_order_release);
- Читай из buf[head & mask] после проверки наличия данных, затем:
head.store(next, std::memory_order_release);
- На чтение границ используйте std::memory_order_acquire:
- Producer: сначала head.load(memory_order_acquire) (чтобы не переписать не потреблённое).
- Consumer: сначала tail.load(memory_order_acquire) (чтобы увидеть свежие записи).
- Ни одного fetch_add не нужно: вычисляй next = idx + 1.
- Проверка переполнения: буфер полон, если next_tail == head.
- Чтобы избежать ложного шаринга — разнеси head, tail и buf (см. alignas(64)).
- Не забудь про TriviallyCopyable/Noexcept: для общего T лучше использовать std::is_nothrow_copy_assignable_v<T> и/или перемещение.
🎯 Бонус-тест
В двух потоках гоняй счётчик 0..1e7 через буфер.
На выходе проверь, что последовательность непрерывна и без пропусков.
Задача: реализуй однопоточный производитель / однопоточный потребитель (SPSC) кольцевой буфер без мьютексов — только на
std::atomic
и правильных порядках памяти.Требования:
-
push(const T&)
и pop(T&)
— O(1)
, без блокировок; возвращают false
, если буфер полон/пуст.- Ёмкость — степень двойки; индексация — маской.
- Гарантируется ровно один поток-производитель и ровно один поток-потребитель.
Скелет:
#include <atomic>
#include <array>
#include <cstddef>
#include <optional>
template<typename T, std::size_t N>
class SpscRing {
static_assert((N & (N - 1)) == 0, "N must be power of two");
public:
bool push(const T& v) {
// твой код
return false;
}
bool pop(T& out) {
// твой код
return false;
}
private:
alignas(64) std::atomic<size_t> head{0}; // consumer reads
alignas(64) std::atomic<size_t> tail{0}; // producer writes
alignas(64) std::array<T, N> buf{};
static constexpr size_t mask = N - 1;
};
💡 Подсказки:
- Пиши в buf[tail & mask], затем публикуй запись:
tail.store(next, std::memory_order_release);
- Читай из buf[head & mask] после проверки наличия данных, затем:
head.store(next, std::memory_order_release);
- На чтение границ используйте std::memory_order_acquire:
- Producer: сначала head.load(memory_order_acquire) (чтобы не переписать не потреблённое).
- Consumer: сначала tail.load(memory_order_acquire) (чтобы увидеть свежие записи).
- Ни одного fetch_add не нужно: вычисляй next = idx + 1.
- Проверка переполнения: буфер полон, если next_tail == head.
- Чтобы избежать ложного шаринга — разнеси head, tail и buf (см. alignas(64)).
- Не забудь про TriviallyCopyable/Noexcept: для общего T лучше использовать std::is_nothrow_copy_assignable_v<T> и/или перемещение.
🎯 Бонус-тест
В двух потоках гоняй счётчик 0..1e7 через буфер.
На выходе проверь, что последовательность непрерывна и без пропусков.
❤5🔥1