TGViewer
Библиотека C/C++ разработчика | cpp, boost, qt Библиотека C/C++ разработчика | cpp, boost, qt @cppproglib · 16.9K subscribers
Post #6160 3.2K
🎫 std::latch — одноразовый счетчик


🩹 Проблема:

Главный поток должен дождаться завершения инициализации в нескольких рабочих потоках перед началом основной работы. Барьер не подходит, так как нужна одноразовая синхронизация, а не переиспользуемая.


💡 Решение:

std::latch (C++20) — это одноразовый счетчик обратного отсчета. Потоки уменьшают счетчик, а другие ждут, пока он достигнет нуля. После срабатывания latch нельзя переиспользовать.


✏️ Пример кода:

#include <iostream>
#include <thread>
#include <latch>
#include <vector>

void worker_init(int id, std::latch& ready_signal) {
// Имитация инициализации ресурсов
std::cout << "Поток " << id << " инициализируется...\n";
std::this_thread::sleep_for(std::chrono::milliseconds(100 * id));

std::cout << "Поток " << id << " готов\n";
ready_signal.count_down(); // Уменьшаем счетчик
}

void worker_process(int id, std::latch& start_signal) {
std::cout << "Поток " << id << " ждет сигнал старта...\n";
start_signal.wait(); // Ждем пока счетчик станет 0

std::cout << "Поток " << id << " начал обработку\n";
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}

int main() {
const int num_workers = 4;
std::latch all_ready(num_workers); // Счетчик для готовности
std::latch start_work(1); // Сигнал для старта

std::vector<std::thread> threads;

// Создаем рабочие потоки
for (int i = 0; i < num_workers; ++i) {
threads.emplace_back([i, &all_ready, &start_work]() {
worker_init(i, all_ready);
worker_process(i, start_work);
});
}

// Главный поток ждет готовности всех
std::cout << "Главный поток ждет инициализации...\n";
all_ready.wait();

std::cout << "Все потоки готовы. Даем сигнал старта!\n";
start_work.count_down(); // Даем сигнал старта

for (auto& t : threads) {
t.join();
}

return 0;
}



‼️ Преимущества:

• Простая одноразовая синхронизация множества потоков
• Эффективное ожидание без активных проверок
• Идеален для сценариев типа ждать «готовности всех»
• Минимальные накладные расходы по сравнению с condition_variable


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

#буст
  • ❤ 12
  • 👍 6
  • 🔥 4
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 →