Based on a (now outdated) #9441.
This runs multiple ThreadMessageHandlers, but only allows them to do (relatively limited) work - it has a whitelisted list of commands which are expected to not take cs_main, and only runs those in a secondary thread, but running anything in the “main thread” (a concept based on randomly acquiring an atomic_bool at the top of the processing loop).
Additionally, it will never be in the ProcessMessages/SendMessages part of the loop for one node in both threads.
With this, #9419, and #9375 (plus changing the whitelisted list of messages) we can respond to getblocktxn requests while another ProcessMessages is busy connecting the block.