Comment mettre en œuvre multithread sûr singleton en C++11, sans l'aide de <mutex>

Maintenant que C++11 a le multithreading, je me demandais quelle est la bonne façon de mettre en œuvre paresseux initialisé singleton sans utiliser les mutex(pour des raisons de perf).
Je suis venu avec cela, mais tbh je ne suis pas vraiment bon à l'écriture lockfree code, donc je cherche des meilleures solutions.

//ConsoleApplication1.cpp : Defines the entry point for the console application.
//
# include <atomic>
# include <thread>
# include <string>
# include <iostream>
using namespace std;
class Singleton
{
public:
Singleton()
{
}
static  bool isInitialized()
{
return (flag==2);
}
static  bool initizalize(const string& name_)
{
if (flag==2)
return false;//already initialized
if (flag==1)
return false;//somebody else is initializing
if (flag==0)
{
int exp=0;
int desr=1;
//bool atomic_compare_exchange_strong(std::atomic<T>* obj, T* exp, T desr)
bool willInitialize=std::atomic_compare_exchange_strong(&flag, &exp, desr);
if (! willInitialize)
{
//some other thread CASed before us
std::cout<<"somebody else CASed at aprox same time"<< endl;
return false;
}
else 
{
initialize_impl(name_);
assert(flag==1);
flag=2;
return true;
}
}
}
static void clear()
{
name.clear();
flag=0;
}
private:
static  void initialize_impl(const string& name_)
{
name=name_;
}
static  atomic<int> flag;
static  string name;
};
atomic<int> Singleton::flag=0;
string Singleton::name;
void myThreadFunction()
{
Singleton s;
bool initializedByMe =s.initizalize("1701");
if (initializedByMe)
s.clear();
}
int main()
{
while (true)
{
std::thread t1(myThreadFunction);
std::thread t2(myThreadFunction);
t1.join();
t2.join();
}
return 0;
}

Noter que clear() est juste pour le test, réel singleton wouldnt ont cette fonction.

InformationsquelleAutor NoSenseEtAl | 2012-07-29