- Do not use a lambda for std::thread as invoke constructor exists - Use simpler std::lock_guard wherever possible - Do not require T to be default constructible - Move T out of the queue instead of copying