Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>А до этого что, плохие были?
Да, были плохие. В основном они касались оформления кода и внимательности при чтении задания. Проблем реализации многопоточного пула коснулись только Вы.
EP>Люди потратили своё время, посмотрели код, даже если тебе обидно — постарайся сдерживать эмоции.
Спасибо за совет, но лучше давайте говорить о программировании.
S>>А не могли бы подробней про 2 и 3?
EP>2. Рассмотри ситуацию когда рабочий поток создался, не получил ни одного задания, а потом разрушился. В этом случае поток проснётся и попробует выполнять this->task, который указывает в никуда.
Да, но это дело обернуто в try..catch и ничего плохого не случится. Ошибка залогируется и едем дальше. Хотя, конечно, надо добавить проверку на nullptr
EP>3. Управляющий поток CThreadPoolX создаётся, но нигде ни join'ится, ни detach'ится. В таком случае деструктор std::thread сделает std::terminate.
Как так? В деструкторе же join-ится
CThreadPoolX::~CThreadPoolX()
{
terminated = true;
jobCV.notify_one();
thread.join();
}