Mutual exclusion is important, but doesn't handle all problems with concurrently executing threads.
In some cases a thread must wait at a point in its code until another thread has changed some state or has possibly has reached a particular point in its code.
How? Mutexes aren't generally useful for this.