Зачем std :: latch, если есть std :: барьер? - PullRequest
0 голосов
/ 27 июня 2018

Из документации довольно ясно, что разница между ними заключается в том, что std::barrier можно использовать более одного раза, а std::latch можно использовать только один раз.

Мне кажется, что std::latch - это просто особый случай std::barrier, который добавляет ограничение вместо функции. Кроме того, в документации говорится, что вызов count_down с n, превышающим внутренний счетчик, является неопределенным поведением, поэтому это ограничение должно применяться программно.

Так зачем нам std::latch?

Мое единственное предположение состоит в том, что можно реализовать std::latch по-разному на аппаратном уровне таким образом, чтобы повысить производительность.

В чем причина?

1 Ответ

0 голосов
/ 27 июня 2018

API мудрый, std::latch позволяет вести обратный отсчет без блокировки. Представьте, что вам нужно сделать 172 пустышки, прежде чем начнётся какое-то другое задание. Вы можете установить защелку со значением 173, и каждая нить, завершающая цикл, будет отсчитывать защелку, и у нити, которая должна потреблять эти щербинки, ждать на защелке.

Рабочие потоки будут вести обратный отсчет, но не будут ждать, так как у них есть другие детали для визуализации. Если они ложатся спать, они используют для этого другой примитив синхронизации.

std::barrier позволяет вести обратный отсчет во время блокировки. Его нельзя использовать, чтобы разрешить 10 нитям отображать 172 бороздки. Единственное, что вы можете сделать в качестве нити на барьере - это достичь его или решить, что вы больше не участвуете.

Могут также быть аппаратные различия, но их API-интерфейсы весьма различны, и замена защелки на барьеры невозможна.

...