Есть вот такая задачка, название конторы-автора оставим за рамками данного обсуждения. Перед тем как постить полный текст, я сам поискал несколько фраз из него в нете и, как ни странно, нашел. Эта публикация не станет первой. Итак…
Используя С++, Win32 API и STL корректно реализовать следующую задачу:
Откуда-то дано:
class Request
{
};
// возвращает NULL, если объект stopSignal указывает на необходимость остановки,
// либо указатель на память, которую в дальнейшем требуется удалить
Request* GetRequest(Stopper stopSignal) throw();
// обрабатывает запрос, но память не удаляет, завершает обработку досрочно, если
// объект stopSignal указывает на необходимость остановки
void ProcessRequest(Request* request, Stopper stopSignal) throw();
Задача:
1) Организовать приём запросов, для этого класть в одну очередь задания, возвращаемые функцией GetRequest.
2) Запустить несколько обрабатывающих запросы потоков (переменное число, но не менее двух), которые должны обрабатывать поступающие из очереди задания с помощью ProcessRequest.
3) Поработать в течение 30 секунд.
4) Корректно остановить все потоки. Если остались необработанные задания, не обрабатывать их и корректно удалить.
5) Завершить программу.
Тип Stopper должен быть определён вами и должен представлять собой механизм досрочной остановки выполняемого действия (предполагается, что GetRequest и ProcessRequest будут его корректно использовать).
Вызов GetRequest может не сразу возвращать задания.
Вызов ProcessRequest может не мгновенно обрабатывать задание.
— Нарисовал за вечер, отправил, ответ получил лишь через неделю, в духе «решение не понравилось, извините», без конкретики. Просьба к уважаемому хабрасообществу пояснить возможные косяки. По ссылке ~300 строк кода.
Собственно мой вариант:
http://pastebin.com/kTQDQyLr
Интересует, что именно плохо и почему так делать нельзя. Исключительно чтобы впредь таких ошибок не совершать.
Указывайте в комментариях суть проблемы, название класса\метода\номера строк. Заранее спасибо!