TGViewer
Библиотека C/C++ разработчика | cpp, boost, qt Библиотека C/C++ разработчика | cpp, boost, qt @cppproglib · 16.9K subscribers
Post #6210 2.62K
✏️ Потокобезопасная инициализация через std::call_once

Инициализация ресурсов в многопоточном приложении — классическая головная боль. std::call_once решает эту проблему элегантно: гарантирует вызов функции ровно один раз, даже если несколько потоков пытаются сделать это одновременно. Забудьте про ручные мьютексы и double-checked locking с их подводными камнями.

#include <mutex>
#include <memory>
#include <iostream>

class DatabaseConnection {
public:
static DatabaseConnection& getInstance() {
// std::call_once гарантирует однократный вызов лямбды
// даже при конкурентном доступе из разных потоков
std::call_once(initFlag, []() {
instance.reset(new DatabaseConnection());
std::cout << "Database initialized\n";
});
return *instance;
}

void query(const std::string& sql) {
std::cout << "Executing: " << sql << "\n";
}

// Запрещаем копирование и перемещение
DatabaseConnection(const DatabaseConnection&) = delete;
DatabaseConnection& operator=(const DatabaseConnection&) = delete;

private:
DatabaseConnection() {
// Тяжелая инициализация: подключение к БД,
// загрузка конфигурации и т.д.
}

static std::once_flag initFlag; // Флаг для call_once
static std::unique_ptr<DatabaseConnection> instance;
};

// Определение статических членов
std::once_flag DatabaseConnection::initFlag;
std::unique_ptr<DatabaseConnection> DatabaseConnection::instance;



‼️ Ключевые особенности:

✅ Потокобезопасность из коробки — не нужен ручной mutex, std::call_once сам блокирует конкурентные вызовы
✅ Без накладных расходов после первого вызова — последующие вызовы проверяют только атомарный флаг
✅ Исключения не ломают логику — если инициализация бросила exception, флаг не устанавливается и следующий поток попробует снова
✅ Работает с любыми callable — лямбды, функции, функторы, std::bind


Используете std::call_once в продакшене? Какие кейсы у вас?

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

#буст
  • 👍 6
  • ❤ 2
  • 😁 1
More from @cppproglib
  1. Sep 19, 2026А вы уже забрали свой подарок ко Дню программиста? К вашему профессиональному празднику Tp…
  2. Sep 18, 2026От исходного кода до процессора: разберись, как работает программа 💻 Стартует практически…
  3. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
  4. Sep 13, 2026🤪 Если бы можно было задать один вопрос про AI в разработке — что бы вы спросили? Как выб…
  5. Sep 13, 2026🤩 Inline static в классах — забудь про .cpp Сколько раз ты забывал добавить определение s…
  6. Sep 13, 2026🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy выра…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →