Is an Event Counter essentially an integer version of Barrier?
An event counter can function like a barrier when a set of threads all use the same value to await. For example, 3 threads can perform an await operation on the Event-Counter EC, using the same value. Then await(EC, common_val), and then threads each will block until the EC is advanced to the common value to synchronize with one another.

However, Event Counter along with Sequencers can be used in many other ways as well, while barrier primitives have only this one type of behavior, used only to allow a set of threads to move through multiple steps. Event Counter along with a Sequencer can also make up a semaphore.