Multithreading decouple update-logic and render-logic
No. Using sleep is the wrong way in any most cases that you can think of. Use the correct functions for this. The C++ standard does not contain a standardized way of doing so. Please use SwitchToThread for Windows and pthread_yield for Unix. To gain more information, you may ask a search engine and for context switching, this is a more common identifier than swapping.
Yes, you are right. Mutual exclusion is indeed slower than a condition variable, whereas it is not always replaceable. Since I don't know how your compiler implements mutexes, you may want to search for differences between mutex and critical sections on Windows. I don't know if there are two different ways also on Unix and other systems. But to answer your question: Yes, one can solve this with condition variables. The difference is very-well stated here.
References are as safe as pointers, since all references are pointers internally after the compiler has done his work. Just be sure not to pass references, that you are expecting to own a resource exclusively, to functions which don't own the resource at all. This leads to very unpredictable code, as wrong coding in multi threaded environments always does.
Seems to be okay. But don't count on my word in the case of the move-operator. I simply don't know if this is going to be valid.