Barriers could be implemented by having all threads send a message to a given thread. When that thread receives the message from all threads, it could then send a message to all threads telling them to continue. Each thread would not continue until receiving this message back--at which point, it would know that all threads had reached the barrier.
The communication serves as a way to do synchronization, if the send/recv is synchronized. Especially when two threads are on different memory spaces or using shared memory is expensive, communication is a good way to help with synchronization.