mercredi 31 décembre 2014

What makes a singleton thread-unsafe?

I read somewhere that a singleton was thread-unsafe. I'm trying to understand why this is. If I have a singleton object like this:



class singleton final
{
public:
static singleton& instance()
{
static singleton unique;
return unique;
}

singleton() = default;
singleton(singleton const&) = delete;
singleton& operator=(singleton const&) = delete;
};


And if I have code like this:



singleton *p1, *p2;

auto t1 = std::thread([] { p1 = &singleton::instance(); });
auto t2 = std::thread([] { p2 = &singleton::instance(); });

t1.join();
t2.join();


Is it possible for p1 and p2 to point to two different singleton instances? If unique is static, does its "static" nature not take affect until it's fully initialized? If that's so, does that mean that a static object's initialization can be accessed concurrently and thus creating multiple static objects?


Aucun commentaire:

Enregistrer un commentaire