Daily bit(e) C++. std::binary_semaphore
Daily bit(e) C++ #232, примитив синхронизации из C++20: std::binary_semaphore
.
std::binary_semaphore
из C++20 – это специализация более общего std::counting_semaphore
, которая поддерживает только два значения: 0 и 1.
Основным вариантом использования бинарного семафора является простая передача сигналов, где альтернативным подходом может быть использование комбинации std::mutex
, std::condition_variable
и логической переменной.
#include <thread>
#include <semaphore>
#include <condition_variable>
{
std::binary_semaphore signal(0);
auto t = std::jthread([&signal]() {
// Ждем, пока этот поток не получит сигнал
signal.acquire();
// Полезный код...
});
// Подаем потоку сигнал для запуска
signal.release();
}
{
// Пример того, как это выглядело бы с условной переменной:
std::mutex mux;
std::condition_variable cond;
bool received = false;
auto t = std::jthread([&mux, &cond, &received]() {
// Ждем, пока этот поток не получит сигнал
std::unique_lock lock(mux);
cond.wait(lock, [&received]{ return received; });
// Полезный код...
});
{ // Подаем потоку сигнал для запуска
std::unique_lock lock(mux);
received = true;
}
cond.notify_one();
}
Открыть пример на Compiler Explorer.