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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
Download Telegram
🤓 Пока Python стал π-thon, ты можешь стать Data Scientist'ом

В Proglib.academy стартует экспресс-курс «Математика для Data Science»: 10 живых вебинаров, практика на Python и спикеры из ВШЭ, Яндекс Практикума и Wildberries, которые всё разложат по полочкам.

В программе:
🔹 матан, линал, теория вероятностей;
🔹 3 практических проекта + викторина с розыгрышем TG Premium;
🔹 поддержка преподавателей и чат с единомышленниками;

🎁 Оплати курс до 19 октября — получи курс по базовой математике в подарок.
🗓️ Старт — 6 ноября

👉 Записаться на курс
😁2
🍬 Потоки могут общаться через condition_variable

Чтобы один поток ожидал другого можно воспользоваться condition_variable.


🍴 Пошаговое решение:

1️⃣ Создайте condition_variable и mutex
2️⃣ Поток ждёт через wait()
3️⃣ Другой поток сигналит через notify_one/notify_all

#include <condition_variable>
#include <mutex>
#include <thread>
#include <iostream>

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void worker() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; }); // Ждём сигнала

std::cout << "Worker started!\n";
}

int main() {
std::thread t(worker);

std::this_thread::sleep_for(std::chrono::seconds(1));

{
std::lock_guard<std::mutex> lock(mtx);
ready = true;
}
cv.notify_one(); // Будим поток

t.join();
return 0;
}


❗️ Частая ошибка: Забыть проверять условие в wait()

💡 Совет: Всегда передавайте предикат в wait()


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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1🙏1
🔥 Фича: std::scoped_lock (C++17)

Захват нескольких мьютексов вручную рискует deadlock при неправильном порядке.

std::scoped_lock атомарно захватывает несколько мьютексов, избегая взаимоблокировок.

До:

std::lock_guard lock1(mtx1);
std::lock_guard lock2(mtx2); // deadlock риск!


После:

std::scoped_lock lock(mtx1, mtx2); // безопасно



💡 Используете std::scoped_lock в своём коде?

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥61
🧐 Хочешь в Data Science, но не знаешь, с чего начать?

Пройди короткий тест по математике — бот покажет, насколько ты готов к переходу и что стоит подтянуть.

Всего пару минут — и ты поймёшь, куда двигаться дальше.


👉 Пройти тест
😁1
💡 C++: Генерация шаблонного кода

Запуск нового C++ проекта часто начинается с рутины: создание классов с конструкторами, деструкторами, операторами копирования/перемещения, шаблоны паттернов... Звучит очень знакомо и ужасно скучно. Что хотябы немного облегчить себе задачу можно воспользоваться AI.

Хотя AI и не знает бизнес-логику проекта, но зато он отлично справляется с созданием базовой структуры проекта.


✏️ Пример использования


Промпт:

Создай boilerplate код для C++ класса ResourceManager, 
который управляет игровыми ресурсами (текстуры, звуки).
Класс должен быть синглтоном,
шаблонными методами загрузки/получения ресурсов и
thread-safe доступом.


Результат:


#pragma once
#include <memory>
#include <unordered_map>
#include <mutex>
#include <string>

template<typename T>
class ResourceManager {
private:
std::unordered_map<std::string, std::shared_ptr<T>> resources;
mutable std::mutex mutex;

// Приватный конструктор для синглтона
ResourceManager() = default;

public:
// Удаляем конструктор копирования и оператор присваивания
ResourceManager(const ResourceManager&) = delete;
ResourceManager& operator=(const ResourceManager&) = delete;

// Конструктор и оператор перемещения
ResourceManager(ResourceManager&&) noexcept = default;
ResourceManager& operator=(ResourceManager&&) noexcept = default;

// Деструктор
~ResourceManager() = default;

// Получение единственного экземпляра (Meyer's Singleton)
static ResourceManager& getInstance() {
static ResourceManager instance;
return instance;
}

// Загрузка ресурса
template<typename... Args>
bool load(const std::string& id, Args&&... args) {
std::lock_guard<std::mutex> lock(mutex);

if (resources.find(id) != resources.end()) {
return false; // Уже загружен
}

auto resource = std::make_shared<T>(std::forward<Args>(args)...);
resources[id] = resource;
return true;
}

// Получение ресурса
std::shared_ptr<T> get(const std::string& id) const {
std::lock_guard<std::mutex> lock(mutex);

auto it = resources.find(id);
return (it != resources.end()) ? it->second : nullptr;
}

// Выгрузка ресурса
bool unload(const std::string& id) {
std::lock_guard<std::mutex> lock(mutex);
return resources.erase(id) > 0;
}

// Очистка всех ресурсов
void clear() {
std::lock_guard<std::mutex> lock(mutex);
resources.clear();
}
};


🍿 Что получили?

• Полностью рабочий шаблонный класс
• Thread-safe операции

Теперь можешь сразу добавлять свою бизнес-логику, вместо того чтобы тратить время на шаблонный код🙂

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🥱21
🎲 Мы не только учим, но и играем!

На экспресс-курсе «Математика для Data Science» — викторина с призом TG-Premium 🎁
Проверь знания, прокачай математику и забери приз.

‼️ Оплатишь до 19 октября — получишь базовый курс в подарок.

👉 Записаться на курс
😁1