An alternative - which could (or could not) apply to your case is to use the gen_event behaviour.
DISCLAIMER
I say "could" because it depends on what your "workers" do in your specific case. If you're interested in the content of their replies, you might prefer not to use this approach, but in the case you're interested just in the fact that all the workers completed their tasks - for example the worker processes do some heavy calculation and store their partial result on a database, so you're ready to combine the partials - the gen_event could be the route to go.
END OF DISCLAIMER
So...
In OTP, an event manager is a named object to which events can be sent.
Events are messages.
In the event manager, zero, one or several event handlers are installed. When the event manager is notified about an event, the event will be processed by all the installed event handlers.
So, basically, instead of having one supervisor and several workers, you have an event manager and several event handlers.
You could then use the gen_event:sync_notify/2 function:
sync_notify is synchronous in the sense that it will return ok after
the event has been handled by all event handlers.
For more information about the *gen_event* look here and there.