Main changes: * Better separation of what is common from what is specific to a communication technique * Consumer wait initialization of all producer threads