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

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; });
}
}
};

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

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

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]