Daily bit(e) C++. std::binary_semaphore

Добавлено 30 сентября 2023 в 07:21

Daily bit(e) C++ #232, примитив синхронизации из C++20: std::binary_semaphore.

Daily bit(e) C++

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.

Теги

C++ / CppDaily bit(e) C++STL / Standard Template Library / Стандартная библиотека шаблоновМногопоточностьПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.