c++ – Singleton Myers and multithreading

Question:

I have heard the phrase more than once:

After c ++ 11, Myers' singleton became thread safe …

Can you explain why this code is suddenly thread safe?

class singleton
{
public:
    static singleton* instance() {
        static singleton inst;
        return &inst;
    }
private:
    singleton() {}
};

Answer:

Это гарантируется стандартом, а именно [stmt.dcl]p4, стандарта C++17 (11 версии под рукой нет).

Dynamic initialization of a block-scope variable with static storage
duration (6.7.1) or thread storage duration (6.7.2) is performed the
first time control passes through its declaration; such a variable is
considered initialized upon the completion of its initialization. If
the initialization exits by throwing an exception, the initialization
is not complete, so it will be tried again the next time control
enters the declaration. If control enters the declaration concurrently
while the variable is being initialized, the concurrent execution
shall wait for completion of the initialization.
If control
re-enters the declaration recursively while the variable is being
initialized, the behavior is undefined.

Минусы подобного подхода мне не известны. Довольно удобный метод создания одиночки.

Scroll to Top