You may find it appropriate to combine the software models in a single program if your task is complex. For example, a program could be designed using the pipelining model, but with one or more steps handled by a work crew. In addition, threads could be assigned to a work crew by taking a task from a work queue and deciding (based on the task characteristics) which threads are needed for the work crew.