Барьеры могут быть использованы повсеместно с помощью надуманных примеров, но вы часто будете показывать их в методе разброса / уменьшения, где результаты различных потоков все требуются, прежде чем продолжить.
Если вы хотите распараллелить сортировку, например, вы можете разделить список n раз и запустить n потоков, чтобы отсортировать их раздел и сделать паузу, когда они все закончат, они умрут, давая понять родителю, что, наконец, можно объединить сортированные куски. (Я знаю, что есть лучшие способы, но это одна реализация).
Другое место, которое я видел, это параллельные сети, где у вас есть для отправки определенного количества данных на полезную нагрузку. Таким образом, интерфейс запустит n блоков и будет ждать их заполнения перед отправкой передачи. Когда вы думаете о разделенной линии T1, это имеет смысл, посылать один пакет данных по 64 мультиплексированным разделам было бы лучше, чем отправлять данные 1 раздела (который, по сути, стоит столько же, так как пакет должен быть дополнен нулями).
Надеюсь, что именно эти вещи заставят вас задуматься над проблемой!