The amount of concurrent validation by block is limited to the physical thread count (or configured if lower), and the block/prevout reads occur in those job executions as well. So the job backlog is just closures held by ASIO, containing nothing but the surrogate key of the block header, so the backlog is very low cost. Still, we limit it to prevent it from buffering the whole chain. That may not be strictly necessary, but I've seen very large ASIO buffers (like billions and even trillions of jobs queued, not t like the ~million height entries) bring the node to a halt.
boost::asio::post(threadpool_.service(), BIND(validate_block, link));