I have a separate thread that I use for loading texture data. It fills out a "PixelData" buffer with pixel data. With my OpenGL code, I can use "fences" to synchronize the upload to the card. I call glFenceSync to get a synchronization object, then tell the driver to upload my PixelData to the card via glTexSubImage2D. This call doesn't block; I can check the state of the synchronization object, and when it's completed I know that the texture is available to me.
How does one do this with DirectX? Right now, my DX texture updating code just calls ID3D11DeviceContext::Map, then a memcpy, and then an Unmap. DirectX is threadsafe, though, right? So I could actually make these three calls from within the thread, and just check with a mutex before using the texture... right?