Scalability has to do with the ability of the program to maintain its efficiency stable when one or more processes/threads are added to it. If a program maintains its efficiency stable through increasing the problem size then that program is weakly scalable, but if it maintains its efficiency stable without changing the problem size, then that program is strongly scalable.
A barrier is used to synchronize all the processes/threads a program uses. It does that by pausing them at the place where the barrier is placed on the code, until all the processes/threads are synchronized. For example, if someone is trying to time a certain part of the code of a program, then in order to assure that all processes/threads are at the same spot by the time the part of code we trying to time is about to be executed, a barrier is placed and therefore no previous processes/threads are timed.