Многоразовый барьер простой (попеременной) реализации

std::mutex mutex;
std::condition_variable cv;
uint8_t size = 2;
uint8_t count = size;
uint8_t direction = -1;

const auto sync = [&size, &count, &mutex, &cv, &direction]()  //.
{
    {
        std::unique_lock<std::mutex> lock(mutex);
        auto current_direction = direction;
        if (--count == 0)
        {
            count = size;
            direction *= -1;
            cv.notify_all();
        }
        else
        {
            cv.wait(lock,
                    [&direction, &current_direction]()  //.
                    { return direction != current_direction; });
        }
    }
};

как указано в первом неприемлемом ответе многоразового барьера

"поколение" должно храниться внутри барьерного объекта, чтобы не дать следующему поколению манипулировать "условием" пробуждения текущего поколения для данного набора потоков. Что мне не нравится в первом неприемлемом ответе, так это растущий счетчик поколений, я считаю, что нам нужно различать не более двух поколений, то есть если поток удовлетворяет условию ожидания и запускает другой вызов синхронизации барьера в качестве второго неприемлемого решения предполагает, что второе решение было несколько сложным, и я полагаю, что приведенный выше фрагмент будет даже достаточно (в настоящее время реализован локально внутри основного, но может быть абстрагирован в структуру). Правильно ли я верю в свое "убеждение", что барьер можно использовать одновременно не более двух поколений?

0 ответов

Другие вопросы по тегам