I do not think that there is a generally accepted correct way to do this. The problem is that the Singleton pattern is avoided in modern software, because having a global reference to to a certain object makes unit testing really hard, sometimes impossible.
Do not misunderstand me, it is ok to have singletons where it seems logical. The problem is with the pattern, where you access them through a global variable or function like MySingletonClass::getInstance()
.
Try injecting it instead where it is needed through constructor parameter, or setter methods.
About multithreading: I do not think that Singletons are any special in this aspect. They are the same as any object accessed concurrently.