Resource-loading is easy enough to handle via thread pools
. You have to make a decision as to what to display during loading, however. It could just be a loading screen, or it could be like in Unreal Engine where low-quality textures are loaded first (and can cause a stall, although it is rare that it does) and as higher-quality texture data is loaded things suddenly gain more detail.
This can be extended to also dynamically flush and reload resources behind-the-scenes to try to allow loading an indefinite amount of resources, which your engine would have to decide to how page in and out.
If you are looking for other ways to utilize 2 cores, again you can just do the multi-threaded rendering technique with a custom command buffer.
Also input should be on its own thread (on Windows it has to be the main thread since input is sent as window messages) since that is the only reliable way to time-stamp the input values you get. This is necessary for smooth processing of input data.
My recommended setup for Windows would be:
Main thread dedicated to input.
2nd thread runs game logic.
3rd thread does rendering.
4th thread does sound processing (and runs on a lower priority, often sleeping).
These 4 threads are dedicated (always running).
Then the thread pool can be used to send more threads out to handle resource loading etc.