
- Главная
- Каталог
- Интернет технологии
- Библиотека C/C++ разработчика
Библиотека C/C++ разработчика
Полезные материалы по всему, что может быть полезно плюсовику/сишнику.
Статистика канала
#include <mutex>
#include <thread>
#include <vector>
#include <iostream>
std::mutex mtx;
std::vector<int> data;
void producer() {
for (int i = 0; i < 100; ++i) {
std::lock_guard<std::mutex> lock(mtx);
data.push_back(i);
}
}
void consumer() {
while (true) {
std::lock_guard<std::mutex> lock(mtx);
if (data.empty()) {
// Ждём данные...
std::this_thread::sleep_for(
std::chrono::milliseconds(10));
continue;
}
std::cout << data.back() << "\n";
data.pop_back();
}
}{}
Вопрос: что не так с consumer()? Почему lock_guard здесь — плохой выбор и как это исправить?
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#междусобойчик
#include <mutex>
#include <thread>
#include <vector>
#include <iostream>
std::mutex mtx;
std::vector<int> data;
void producer() {
for (int i = 0; i < 100; ++i) {
std::lock_guard<std::mutex> lock(mtx);
data.push_back(i);
}
}
void consumer() {
while (true) {
std::lock_guard<std::mutex> lock(mtx);
if (data.empty()) {
// Ждём данные...
std::this_thread::sleep_for(
std::chrono::milliseconds(10));
continue;
}
std::cout << data.back() << "\n";
data.pop_back();
}
}{}
Вопрос: что не так с consumer()? Почему lock_guard здесь — плохой выбор и как это исправить?
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#междусобойчикsleep_for(100ms) остановит поток ровно на 100 мс, то это не так. На деле — это минимальное время ожидания, не точное.
Когда ты вызываешь std::this_thread::sleep_for, происходит следующее: поток переводится в состояние WAITING в планировщике ОС. Ядро ставит таймер и убирает поток из очереди на исполнение. Когда таймер срабатывает, поток не просыпается мгновенно — он попадает обратно в ready queue и ждёт, пока планировщик выделит ему квант времени.
auto start = std::chrono::steady_clock::now();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
auto elapsed = std::chrono::steady_clock::now() - start;
// elapsed может быть 102ms, 115ms, даже 130ms{}
⚡️ На Linux гранулярность таймера по умолчанию — около 1–4 мс (зависит от CONFIG_HZ). На Windows — исторически 15.6 мс, если не вызвать timeBeginPeriod(1)
💡 Если нужна точность ниже миллисекунды — ОС-пауза не подойдёт. Для таких задач используют spin-wait с std::chrono::high_resolution_clock, жертвуя CPU ради точности.
🐸 Учитывай это при реализации любого setPause-подобного механизма в game loop или real-time системах.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность
std::vector<int> v = {1, 2, 3, 4, 5};
for (int x : v | views::reverse) {
std::cout << x << " "; // 5 4 3 2 1
}{}
bidirectional_range. Например, views::filter моделирует bidirectional_range, только если исходный диапазон сам bidirectional_range и common_range — так что для vector, deque или list цепочка views::filter(...) | views::reverse работает, а для forward_list или istream_view — нет.
std::map<std::string, int> ages = {{"Алиса", 30}, {"Борис", 25}};
for (const auto& name : ages | views::keys) {
std::cout << name << "\n"; // Алиса, Борис
}
for (int age : ages | views::values) {
std::cout << age << "\n"; // 30, 25
}{}
Под капотом views::keys — это views::elements<0>, а views::values — views::elements<1>. Работает с любым диапазоном, элементы которого моделируют std::pair или std::tuple-подобный тип.
std::vector<std::tuple<int, std::string, double>> records = {
{1, "Alice", 3.14},
{2, "Bob", 2.71},
};
// Берём только строки (индекс 1)
for (const auto& s : records | views::elements<1>) {
std::cout << s << "\n"; // Alice, Bob
}{}
Обобщённая версия keys/values — извлекает элемент с индексом N из каждого кортежа. Индекс задаётся на этапе компиляции, поэтому выход за границы — ошибка компиляции, а не UB.
std::vector<int> v = {10, 20, 30, 40, 50};
auto it = v.begin() + 1; // указывает на 20
// 3 элемента начиная с позиции 1
auto three = views::counted(it, 3);
// 20, 30, 40{}
В отличие от views::take, который работает с диапазоном, counted принимает итератор + количество. Это незаменимо, когда у вас «голый» итератор без парного end — например, указатель указатель на элемент C-массива или результат std::find.
it + n не выходит за пределы, лежит на вас — проверки в рантайме нет.
std::vector<int> v = {1, 2, 3};
// views::all явно создаёт view из контейнера
auto all_view = views::all(v);
// Это полезно при передаче в функции, ожидающие view{}
Зачем нужен, если | и так оборачивает? Бывает полезно при передаче контейнера в функцию, которая принимает viewable_range, или для хранения view в переменной без auto&&. На практике views::all вызывается неявно почти в каждой цепочке — но иногда явный вызов делает код яснее.
begin() и end() возвращают один и тот же тип. У ленивых view это часто не так — end() может вернуть sentinel, а не итератор.
auto view = some_range | views::filter(...);
// Если нужно передать в старый алгоритм, требующий итераторов одного типа:
auto common_view = view | views::common;
std::copy(common_view.begin(), common_view.end(), output);{}
common_range, адаптер ничего не делает — просто пробрасывает как есть. Накладных расходов в этом случае ноль.
std::map<std::string, std::vector<int>> data = {
{"alpha", {1, 2, 3}},
{"beta", {4, 5}},
{"gamma", {6, 7, 8, 9}},
};
// Все значения → сплющить → обратный порядок → первые 4
auto result = data
| views::values
| views::join
| views::reverse
| views::take(4);
for (int x : result) {
std::cout << x << " "; // 9 8 7 6
}{}
Ни одного промежуточного контейнера — каждый элемент протягивается через всю цепочку лениво, по требованию.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность“KV-cache hit rate is the single most important metric for a production-stage AI agent.”🛠 Что внутри методички (комбо из 3 статей + код):
Экономика кэширования — особенности провайдеров и как правильно считать затраты. Частые анти-паттерны — почему ваш кэш постоянно сбрасывается и вы платите больше. Кэш в AI-агентах — специфика работы с памятью в автономных системах.🍒 Вишенка на торте: готовый SKILL для агента, который делает ревью вашего проекта, находит анти-паттерны и предотвращает низкое попадание в кэш. — Забрать комбо-материалы на GitHub P.S. Если хотите послушать Сергея вживую — ловите его на конференциях Kode Waves (май), Conversations AI и Highload Spb (июнь). 🎁 Акция в честь старта продаж! Прямо сейчас при покупке Инженерного трека вы получаете полный доступ к материалам курса «Разработка ИИ-агентов» в подарок. 👉 Забрать 2 курса по цене 1 и начать обучение
Отзывы канала
всего 2 отзыва
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Библиотека C/C++ разработчика — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 33.9K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 6.4, количество отзывов – 2, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 13986.0 ₽, а за 14 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий