C++ (Qt)int a = 0;...a = 1;
C++ (Qt)int abortFlag = 0; // thread 1 while (!abortFlag) { ....} // thread 2 (main) abortFlag = 1;// thread1.joint();
int m_i = 0; // в классеm_i++; // в функции
int counter = 0; // общий счетчикfor (int i = 0; i < 10000; ++i) {doWork(); ++counter;}
int counter = 0; // общий счетчикfor (int i = 0; i < 10000; ++i) {doWork();}counter = 9999;
data = std::make_shared<xxx> (...);ready = true;
int ready; // локальная ...data = std::make_shared<xxx> (...);ready = true;
inc dword_ptr[some_offset]
a = 1;b = 2;
mutex.lock();a = 1;
if (!m_instance) { std::unique_lock<std::mutex> l(m_mutex); if (!m_instance) m_instance = new Singleton();}return m_instance;
if (!m_instance) { auto tmp = malloc(sizeof (Singleton)); new (tmp) Singleton(); m_instance = tmp;}
if (!m_instance) { m_instance = malloc(sizeof (Singleton)); // <=== ой, тут пробой - указатель УЖЕ не ноль, а объекта ещё нет new (m_instance) Singleton();}
if (!m_instance) { auto tmp = malloc(sizeof (Singleton)); m_instance = tmp; // процессор сделал reorder // <=== ой, тут пробой new (tmp) Singleton(); // предположим что тут "вызов" заинлайнился и в конструкторе мы не юзаем m_instance, т.е. нет зависимости по данным}
C++ (Qt)Singleton* Singleton::instance () { Singleton* tmp = pInstance; ...// insert memory barrier if(tmp == 0) { Lock lock; tmp = pInstance; if (tmp == 0) { tmp = new Singleton; ...// insert memory barrier pInstance = tmp; } } return tmp;}
C++ (Qt)std::atomic_thread_fence(std::memory_order_acquire);
C++ (Qt)if (!m_instance) { std::unique_lock<std::mutex> l(m_mutex); if (!m_instance) { auto temp = new Singleton(); if (temp) m_instance = temp; }}return m_instance;