This may be fine for a trivial example of std::thread and std::mutex but you should almost never do this in practice (there are some exceptions in kernel space when waiting for an I/O device).
I have a few useful rules of thumb when doing multi threaded programming which I want to share:
1) Almost every mutex should be coupled with one or (usually) more condition variables
2) A mutex variable named "mutex" is a code smell. Ditto for condition variables named "cond". They usually have an easy-to-describe function such as "queue_lock", "not_full" or "not_empty".