Ну, в принципе, есть два способа распределить работу между рабочими потоками. Первый - хранить рабочие элементы в очереди. Когда у вас есть работа, вы помещаете ее в очередь и подаете сигнал рабочим. Ваши рабочие потоки будут выглядеть примерно так:
while( !quit ) {
WaitForWork();
GetWorkItem();
ExecuteWorkItem();
}
Это подход, который вы должны использовать согласно рекомендации.
Другой подход - поддерживать очередь работников. Когда у вас есть работа, которую вам нужно сделать, вы забираете работника из очереди (или создаете его, если он пуст) и приказываете ему запустить элемент. Этот второй подход более сложен для кодирования и, как правило, менее эффективен.