MultiThreading rules for Direct3D 11
Each ID3D11DeviceContext is singlethreaded, meaning that only one thread can call into a device context at a time. If multiple threads wish to access a single context, they must synchronize outside the API, using locks such as critical sections. This implies that a single command list can only be generated in a singlethreaded fashion (but multiple deferred contexts can be used simultaneously, each by a single thread, to simultaneously create multiple command lists). This also implies that it is illegal to play back two command lists simultaneously on the immediate context.
When the driver does not support multithreaded creates, the API will use synchronization internally. When the driver does not support command lists, the runtime provides software command lists. That is, you can use the multithreaded features of D3D11 without ever checking whether or not the driver supports the features.
DXGI shares the same thread resources as the D3D immediate context. It is illegal to use DXGI methods (other than AddRef, Release, QueryInterface) at the same time as the immediate context.
For applications with separate threads for processing command lists and displaying frames, there is the question of how to keep the GPU busy while still displaying frames in a timely fashion, since synchronized access to the immediate context is required for both tasks, and processing in general could take arbitrarily long. One possible solution is to use a separate D3D11 device for each thread, and to share textures to be displayed by creating them with the D3D11_RESOURCE_MISC_SHARED flag. In this scenario, ID3D11DeviceContext::Flush should be called on the processing thread to complete the execution of the command list prior to displaying the final texture in the display thread.