Внутри CalculateFib2
первое, что вы делаете - ждете условия (cv
). Это условие только получает сигнал в конце CalculateFib
. Таким образом, само собой разумеется, что выполнение никогда не продолжается, если только условие не запущено (путем публикации CalculateFib
) задания.
Действительно, добавив любую другую строку, например:
io_service->post( boost::bind( CalculateFib, 5 ) );
io_service->post( boost::bind( CalculateFib, 4 ) );
io_service->post( boost::bind( CalculateFib, 3 ) );
io_service->post( boost::bind( CalculateFib2, 1 ) );
io_service->post( boost::bind( CalculateFib2, 1 ) );
io_service->post( boost::bind( CalculateFib, 5 ) ); // <-- ADDED
делает выполнение выполненным до конца.
В попытке пролить больше света: если вы изолируете партию Fib2 (вовремя), как
io_service->post( boost::bind( CalculateFib, 5 ) );
io_service->post( boost::bind( CalculateFib, 4 ) );
io_service->post( boost::bind( CalculateFib, 3 ) );
boost::this_thread::sleep(boost::posix_time::seconds( 10 ));
io_service->post( boost::bind( CalculateFib2, 1 ) );
io_service->post( boost::bind( CalculateFib2, 1 ) );
io_service->post( boost::bind( CalculateFib2, 1 ) );
io_service->post( boost::bind( CalculateFib2, 1 ) );
io_service->post( boost::bind( CalculateFib2, 1 ) );
io_service->post( boost::bind( CalculateFib2, 1 ) );
все задания Fib2 всегда будут блокироваться, независимо от количества потоков, потому что все задания Fib были завершены до их публикации. Простой
io_service->post( boost::bind( CalculateFib, 1 ) );
разблокирует все официанты (т. Е. Только столько, сколько есть ожидающих потоков, то есть число доступных потоков -1, потому что задания Fib () также занимают поток. Теперь с <7 потоками это может зайти в тупик, потому что нет потока, доступного даже для запуска задания Fib () на </strong> (все потоки заблокированы в ожидании в Fib2)
Если честно, я не понимаю, чего вы пытаетесь достичь с точки зрения планирования. Я подозреваю, что вы должны отслеживать очереди заданий и явно публиковать задания («задачи») только тогда, когда вы достигли необходимого количества элементов. Таким образом, вы сможете ПОЦЕЛУЙ и получите очень гибкий интерфейс для планирования работы.
В общем случае с группой потоков (пулом) вы хотите избежать блокировки потоков на неопределенное время. Это может привести к блокировке вашего рабочего графика и плохой работе в противном случае.